在用Apache作web服务器的时候,有的时候须要将输入的URL转换成另外一个URL这种需求。好比用CodeIgniter框架开发web应用的时候,咱们访问的全部路径都要通过index.php,由这个index.php作统一路由,访问地址以下:php
example.com/index.php/news/article/my_article
每次访问都带着index.php,实在太多余了,咱们想要一个干净的地址以下:html
example.com/news/article/my_article
这时你的 Apache 服务器须要启用mod_rewrite,而后简单的经过一个 .htaccess 文件再加上一些简单的规则就能够移除URL中的 index.php 了。下面是这个文件的一个例子, 其中使用了 "否认条件" 来排除某些不须要重定向的项目:web
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
在上面的例子中,除已存在的目录和文件,其余的 HTTP 请求都会通过你的 index.php 文件。也就是说单用户在地址栏里输入【example.com/news/article/my_article】的时候实际上访问的是【example.com/index.php/news/article/my_article】。正则表达式
Apache2.xapache
LoadModule rewrite_module modules/mod_rewrite.so
编程
启用.htaccess
AllowOverride None 修改成: AllowOverride All服务器
学习Rewrite须要重点了解它的三个核心:RewriteEngine,RewriteCond,RewriteRule。app
这个是rewrite功能的总开关,用来开启是否启动url rewrite框架
RewriteEngine on
编程语言
RewriteCond就是一个过滤条件,简单来讲,当URL知足RewriteCond配置的条件的状况,就会执行RewriteCond下面紧邻的RewriteRule语句。
RewriteCond的格式以下:RewriteCond %{NAME_OF_VARIABLE} REGX FLAG
举个例子:
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} ^Mozilla//5/.0.* RewriteRule index.php index.m.php
若是设置上面的匹配规则,到来的http请求头中的HTTP_USER_AGENT匹配【^Mozilla//5/.0.*】正则表达式的话,则执行下面的RewriteRule,也就是说访问路径会跳转到 index.m.php这个文件。
RewriteCond 和 RewriteRule 是上下对应的关系。能够有1个或者好几个RewriteCond来匹配一个RewriteRule
那么RewriteCond能够匹配什么样的数据请求呢?
RewriteCond %{HTTP_REFERER} (www.test.cn) RewriteCond %{HTTP_USER_AGENT} ^Mozilla//5/.0.* RewriteCond %{REQUEST_FILENAME} !-f
上面是常见的3种最多见使用最多的HTTP头链接与请求匹配。
RewriteRule是配合RewriteCond一块儿使用,能够说,RewriteRule是RewriteCond成功匹配后的执行结果,因此,它是很重要的。
RewriteRule的格式
RewriteRule Pattern Substitution [flags]
Pattern是一个正则匹配。Substitution是匹配的替换 [flags]是一些参数限制;
举几个栗子:
RewriteRule ^room/video/(\d+)\.html web/index\.php?c=room&a=video&r=$1 [QSA,NC,L]
意思是以 room开头的 room/video/123.html 这样子,变成 web/index.php?c=room&a=video&r=123
RewriteRule \.(jpg|gif) http://image.baidu.com/ [R,NC,L]
意思是觉得是访问.jpg或者gif的文件,都会调整到 http://image.baidu.com
从上面看出,掌握Rewrite,学习正则表达式是关键所在。
咱们再看看[flags]是什么意思?
由于它太多了。我就挑几个最经常使用的来讲说。