https部署折腾(一):.htaccess配置重定向参数RewriteCond和RewriteRule解释

对于完成一件比较麻烦的事,做完后是一定要写教程的,呃,其实应该是记录过程,也不是想教谁,只是希望以后自己再用的时候还找得到用法。话说过程是惊险刺激的,有时兴奋,有时却恨不得去屎… 而扫尾工作就是最枯燥到的了,比如现在… 但是事后不总结、不记录,那是永远无法成长的。就像我这次部署https一样,其实那篇发泄文(见《吐个槽,糟心的一天》)写完就打算放弃部署https了,结果文章结尾的时候提示了自己一个很重要的问题,最后找到了方法部署成功… 这个后期再说。

今天玩了下.htaccess,所以提前把这个写了,相当于是部署https的周边技术吧,有时间写一点,最后再汇总成如何部署https,我觉得这样不错,好了,说了这么多闲话了,开始教程吧。

.htaccess对于我来说就是用来做301重定向的,它的主要作用貌似也就是这个了。主要靠写在文件中的语句执行重定向,比如

<IfModule mod_rewrite.c> 
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

这个是一个基本配置,将“/”和404重定向到/index.php去,我们可以看到语句有好几种,比较关键的是RewriteCond和RewriteRule。

先举个栗子:

RewriteCond %{HTTP_HOST} ^(juw)end(s)\.com.*$ [NC]
RewriteRule aa(.*)cc(.*)$ http://ww\./$2/$1/%1/%2 [R=301,L]

看起来是有点复杂,先看结果:

网址输入地址:juwends.com/aaa/bbb/ccc/?p=1
重定向地址:http://ww.///a/bbb/c/juw/s?p=1

下面一段一段的来解释:

1,RewriteCond有3个参数,分别是:

“%{HTTP_HOST}”、“^(juw)end(s)\.com.*$”、“[NC]”

● “%{HTTP_HOST}”:要被替换的地址,也就是地址栏输入的地址了;

● “^(juw)end(s)\.com.*$”:如果第一个参数满足这个正则表达式,那么就会进行重定向,反之则不会,这里需要有丢丢正则表达式的知识,具体不多说了,去网上查查资料。这里需要说明的是式子中的括号,每一个括号表示一个组,在下面的RewriteRule的第二个参数中会用到,注意:只有组中式子代表的值(括号里代表的值)才能在该语句的第二个参数中用得到;

● “[NC]”:匹配时不区分大小写,还有一些其他的值,网上一大把详细介绍,不多说。

2,RewriteRule也有3个参数,分别是:

“aa(.*)cc(.*)$”、 “http://ww\./$2/$1/%1/%2”、 “[R=301,L]”

● “aa(.*)cc(.*)$”:这个参数值网上教程就讲得很少,也很不清楚了,下面我来详细讲一下。

这个参数值也是正则表达式,是为了该语句的第二个参数取值用的,而这个式子要匹配的字符串是上面的“%{HTTP_HOST}”去掉域名和域名后面的斜杠“/”后,剩下的部分,比如我输入的是“juwends.com/aaa/bbb/ccc/?p=1”,那么这段正则式要匹配的地址就是“aaa/bbb/ccc/”,注意:没有“?p=1”,因为“?p=1”是传递的参数,会被重定向后再拼接到地址后面的;

括号和上面一样,用于分组,这里有2组括号,就说明有两组,而且同样是只有组中式子代表的值才能在该语句的第二个参数中用得到;

● “http://ww\./$2/$1/%1/%2”:要重定向到的地址,这个地址中包含2个变量符(暂时这么称呼吧,我也不知道确切应该叫什么):“%”和“$”,这两个符号在网上也很少有人提到(不知道是因为大家都感觉很简单还是咋滴,反正当时我是一头雾水…)。

“%”是用来取RewriteCond的第二个参数中的值的,“%”后面的数字表示取哪一个组的值,比如例子中的值是“^(juw)end(s)\.com.*$”,那么“%1”代表“juw”,“%2”代表“s”

同理,“$”是用来取RewriteRule第一个参数所代表的值的,比如例子中的式子是“aa(.*)cc(.*)$”,那么“$1”就是第一个括号中“.*”这个正则式所代表的值,“$2”就是第二个括号中“.*”这个正则式代表的值。

结合输入的地址来解释一下:

输入了“juwends.com/aaa/bbb/ccc/?p=1”,那么“aa(.*)cc(.*)$”要匹配的地址就是“aaa/bbb/ccc/”,那么第一个括号代表的值就是“a/bbb/c”(正则按贪心匹配,即匹配最长,真的有勾贪心的),即$1,第二个括号代表的值就是“/”,即$2,结合上面说的,“%1”是“juw”,“%2”是“s”,这样,按照第二个参数“http://ww\./$2/$1/%1/%2”组合起来就是“http://ww.///a/bbb/c/juw/s”,最后再拼接上“?p=1”,就是 “http://ww.///a/bbb/c/juw/s?p=1”,就是结果没错了!

估计有点迷糊吧,多看多试几遍就懂了,如果这个参数不加“http://”,那么重定向的地址前面会加上域名的,而且貌似后面的值不是我们想象的值了,这个需要再研究,另外,如果网址是一个正常的网址,那么像上面那种连着很多个斜杠,如“ww.///a”就会变成一根斜杠,即“ww./a”。

● “[R=301,L]”:最后一个参数,R=301表示301重定向,L表示如果执行了这个语句,那么后面的重定向语句就不执行了,网上一大把教程,不多说了。

东西介绍完了,如果有兴趣可以在本地玩玩,配置一个phpStudy,然后修改hosts搞一个虚拟域名,就可以测试了,注意apache要开启.htaccess的使用,需要将配置文件httpd.conf中的所有“AllowOverride”改为“All”。

本文《https部署折腾(一):.htaccess配置重定向参数RewriteCond和RewriteRule解释》来自 www.juwends.com ,欢迎转载或CV操作,但请注明出处,谢谢!