Mod Rewrite连续规则的URL使用逻辑咨询
Mod Rewrite连续规则的URL使用逻辑咨询
嘿,这个问题我当初刚摸mod_rewrite的时候也纠结过,刚好能给你掰扯清楚~
默认情况下,mod_rewrite的规则是链式处理的:当第一条RewriteRule匹配并完成重写后,重写后的URL会作为第二条规则的"输入",也就是第二条规则会基于这个修改后的路径去匹配,而不是原始URL。
举个实际的例子你一看就懂:
# 第一条规则:把 /about-us 重写成 /about RewriteRule ^about-us$ /about # 第二条规则:把 /about 重写成 /info RewriteRule ^about$ /info
如果用户访问yourdomain.com/about-us,第一条规则会先把路径改成/about,紧接着第二条规则会匹配这个新路径,最终把它改成/info——整个流程是接力式的。
不过这里要注意[L]标志的影响:如果第一条规则加了[L](代表Last),那在当前规则处理轮次里,后续的规则就不会再执行了。比如:
RewriteRule ^about-us$ /about [L] RewriteRule ^about$ /info
这时候访问/about-us,只会被重写成/about,第二条规则不会触发,因为[L]让当前轮次的规则处理直接终止。
要是你想让后续规则始终基于原始URL来匹配,那可以通过%{REQUEST_URI}这个服务器变量来引用原始请求路径,比如:
RewriteRule ^about-us$ /about # 只有当原始请求是 /about-us 时,才触发这条规则 RewriteCond %{REQUEST_URI} ^/about-us$ RewriteRule ^.*$ /another-page
这里第二条规则的RewriteCond检查的是原始的请求URI,所以哪怕第一条规则已经把路径改成了/about,这条规则依然会因为原始请求是/about-us而触发。
其实这个逻辑在官方文档里是有提到的,不过确实藏在“规则处理流程”的细节里,容易被忽略~
备注:内容来源于stack exchange,提问作者eos
相关产品推荐
相关产品推荐

