RewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewriteRewrite比如在使用CodeIgniter框架开发web应用时,我们访问的所有路径都要经过index.php,而这个index.php就是用来做统一路由的。访问地址如下:example.com/index.php/news/article/my_article每次访问都带着index.php,太多了。我们想要一个干净的地址如下:example.com/news/article/my_article这时候你的Apache服务器需要开启mod_rewrite,然后简单的传递一个.htaccess文件,然后添加一些简单的规则,将index.php从网址。这是此文件的示例,其中“负面条件”用于排除某些不需要重定向的项目:RewriteEngineOnRewriteCond%{REQUEST_FILENAME}!-fRewriteCond%{REQUEST_FILENAME}!-dRewriteRule^(.*)$index.php/$1[L]在上面的例子中,除了已经存在的目录和文件,其他的HTTP请求都会经过你的index.php文件。也就是说,当单个用户在地址栏输入[example.com/news/article/my_article]时,他实际上访问的是[example.com/index.php/news/article/my_article]。Rewrite使用详解 确认Apache是??否加载了Rewrite模块Apache2.xLoadModulerewrite_modulemodules/mod_rewrite.soEnable.htaccessAllowOverrideNone改为:AllowOverrideAllRewriteCond和RewriteRule学习Rewrite需要重点理解其三个核心:RewriteEngine、RewriteCond、RewriteRule.RewriteEngine是rewrite函数的总开关,用于开启url是否启动rewriteRewriteEngineonRewriteCondRewriteCond是一个过滤条件。简单的说,当URL满足RewriteCond配置的条件时,RewriteCond正下方的RewriteRule语句就会被执行。RewriteCond的格式如下:RewriteCond%{NAME_OF_VARIABLE}REGXFLAG例如:RewriteEngineonRewriteCond%{HTTP_USER_AGENT}^Mozilla//5/.0.*RewriteRuleindex.phpindex.m.php如果设置了以上匹配规则,传入的http请求头中的HTTP_USER_AGENT如果匹配到[^Mozilla//5/.0.*]正则表达式,就会执行下面的RewriteRule,也就是说访问路径会跳转到index.m.php文件。RewriteCond和RewriteRule上下对应。匹配一个RewriteRule可以有一个或多个RewriteConds,那么RewriteCond可以匹配什么样的数据请求呢?RewriteCond%{HTTP_REFERER}(www.test.cn)RewriteCond%{HTTP_USER_AGENT}^Mozilla//5/.0.*RewriteCond%{REQUEST_FILENAME}!-f以上是最常用的3种HTTP头连接和请求匹配。HTTP_REFERER当前请求页面的源页面地址当前请求头中User-Agent:项的内容,如果存在。该字符串指示有关访问该页面的用户代理的信息。一个典型的例子是:Mozilla/5.0(WindowsNT10.0;WOW64;rv:64.0)Gecko/20100101Firefox/64.0。REQUEST_FILENAME当前请求的文件名RewriteRule的写法和规则RewriteRule与RewriteCond一起使用。可以说RewriteRule是RewriteCond匹配成功后的执行结果,所以非常重要。RewriteRuleRewriteRulePatternSubstitution[flags]Pattern的格式为正则匹配。Substitution是一个匹配替换[flags]是一些参数限制;举几个例子:RewriteRule^room/video/(\d+)\.htmlweb/index\.php?c=room&a=video&r=$1[QSA,NC,L]表示room/video/123.html以room,变成web/index.php?c=room&a=video&r=123RewriteRule\.(jpg|gif)http://image.baidu.com/[R,NC,L]表示访问.jpg或gif文件时,他们会调整到http://image.baidu.com从上面可以看出,掌握Rewrite和学习正则表达式是关键。我们来看看【flags】是什么意思?因为太多了。我只挑几个最常用的。[QSA]qsappend(appendquerystring)的意思,第二个标记强制重写引擎在已有的替换字符串后面追加一个查询字符串,而不是简单的替换它。如果您需要通过重写规则向请求字符串添加信息,请使用此标志。对于上面的房间示例,您必须使用它。[NC]nocase(忽略大小写),使Pattern忽略大小写,即Pattern匹配当前URL时,“A-Z”和“a-z”没有区别。这个一般是加上的,因为我们的url本身是不区分大小写的。[R]redirect(强制重定向)的含义适用于匹配Pattern后Substitution为http地址url的情况,被定向出去。上面指向image.baidu.com的例子也必须使用它。[L]last(endrule)表示匹配到,马上停止,不再匹配后面的Rule,类似于编程语言中的break语法,跳出。参考Apache的虚拟域名重写配置和.htaccess的使用。Apache的Rewrite详解
