前两天部署一个项目到本机环境,从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、找到
<Directory />
AllowOverride NONE
Require all granted
</Directory>
改成
<Directory />
AllowOverride ALL
Require all granted
</Directory>
3、在项目根目录下创建 .htaccess 文件,在该文件中输入(windows下无法直接创建。htaccess文件,可先新建记事本,再另存为)
<IfModulemod_rewrite.c>
Options Indexes FollowSymlinks
RewriteEngine On #启动重写引擎
RewriteCond %{REQUEST_FILENAME} !-d #判断请求文件是否为目录
RewriteCond %{REQUEST_FILENAME} !-f #判断请求文件是否为文件
RewriteRule ^(.*)$ index.php/$1 #重写规则,用正则表达式
</IfModule>
以上即为启用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文件中的语法是一样的。