apache重写规则

前两天部署一个项目到本机环境,从nginx转到apache,因为不熟悉apache的重写规则,给自己挖了很多坑。。看了很多博客后,终于解决了问题,总结如下。

什么是url重写?

url重写可以把冗长的url地址按我们自定义的规则来简化。比如一个类似 www.test.com?user_id=123&user_ps=abc 的域名,通过url重写,我们直接以 www.test.com/123/abc 的方式来访问。这样是不是简洁多了?这样既可以增强seo,同时也可以处理形如访问url不存在的问题。

启动url重写的步骤如下

1、打开apache/conf目录下的httpd.conf,找到

#LoadModule rewrite_module modules/mod_rewrite.so

将最前面的#去掉

2、找到

 

 AllowOverride NONE   

 Require all granted

改成

AllowOverride ALL  

Require all granted

3、在项目根目录下创建 .htaccess 文件,在该文件中输入(windows下无法直接创建。htaccess文件,可先新建记事本,再另存为)

Options Indexes FollowSymlinks

RewriteEngine On                                                        #启动重写引擎

RewriteCond %{REQUEST_FILENAME} !-d               #判断请求文件是否为目录

RewriteCond %{REQUEST_FILENAME} !-f               #判断请求文件是否为文件

RewriteRule ^(.*)$ index.php/$1                              #重写规则,用正则表达式

以上即为启用url重写的步骤,接下来具体介绍一下.htaccess文件中各字段的意义和属性。

Options Indexes FollowSymLinks就表示:我访问www.test.com,如果文件根目录里有 index.html(index.php),浏览器就会显示 index.html的内容,如果没有 index.html,浏览器就会显示这文件根目录的目录列表,目录列表包括文件根目录下的文件和子目录。

考虑到安全问题,不想让别人访问到目录文件,应该怎么办呢?只需要将Indexes字段删掉即可。再次访问该域名,如果不存在index.html或者index.php文件,则会报403错误。

RewriteEngin On表示启用重写引擎,将On改为Off即可关闭重写引擎,方便我们启动或关闭重写引擎,而无需修改大量代码。

RewriteCond表示重写条件,类似于if条件语句,一般形式为    RewriteCond %{XXXXXXX} + 正则匹配条件    ,可以多条RewriteCond对应一条RewriteRule

RewriteRule 表示重写规则,一般形式为  RewriteRule 正则匹配条件  XXXXXX ,上文的

RewriteRule ^(.*)$ index.php/$1

表示将任意请求改成index.php/$1,其中$1表示正则表达式中第一个()中的值。

对于AllowOverride All,表示允许.htaccess覆写httpd.conf中的设置,如果想禁止.htaccess起作用 ,将All改成none就可以了

在这里对.htaccess的利弊做一些补充

当我们是与其他人共享服务器的情况下,我们可能无法直接修改服务器的配置,通过.htaccess可方便我们对服务器进行修改,且不会干预到他人。但这样做会导致性能降低,理由如下:

一个.htaccess文件是对当前目录及其子目录起作用的,也就是说当我们访问一个文件时,服务器不仅要从检查当前目录下的.htaccess文件,还要检查其父目录的,很有可能还要检查其祖父级目录的,无论这些目录中.htaccess文件是否存在,这样就可能有很多次的访问是没有必要的,影响了性能。

所以如果可以,尽可能直接修改httpd.conf文件,具体的语法与.htaccess文件中的语法是一样的。

你可能感兴趣的:(apache重写规则)