Apache mod Rewrite规则匹配忽略数字,如何调整使其正常生效?
问题原因
你使用的L标记仅会终止当前一轮的重写规则匹配,Apache会把重写后的URI重新投入处理流程,触发新一轮的重写规则校验,这就是规则表现差异的核心原因:
- 匹配词为
talis时:首次请求命中第一条规则重写到talis.php,新一轮匹配时talis.php路径本身包含talis,会再次命中第一条规则,不会走到第二条,最终返回talis.php符合预期。 - 匹配词为
talis01时:首次请求命中第一条规则重写到talis.php,新一轮匹配时talis.php路径不包含talis01,就会命中第二条规则,最终被重写到index.php。
解决方案
方案1(Apache 2.4及以上版本推荐)
将第一条规则的L标记替换为END标记,END标记会彻底终止所有后续重写流程,不会触发重入匹配:
RewriteEngine On RewriteRule talis01 talis.php [END] RewriteRule . index.php [L]
方案2(兼容Apache 2.2及更早版本)
给规则添加判断条件,仅对用户原始发起的请求生效,排除内部重定向的请求:
RewriteEngine On RewriteCond %{REDIRECT_STATUS} ^$ RewriteRule talis01 talis.php [L] RewriteCond %{REDIRECT_STATUS} ^$ RewriteRule . index.php [L]
方案3
直接匹配存储原始请求URI的%{REQUEST_URI}变量,该变量不会随重写操作变化:
RewriteEngine On RewriteCond %{REQUEST_URI} talis01 RewriteRule ^ talis.php [L] RewriteRule . index.php [L]
内容的提问来源于stack exchange,提问作者Itay Moav -Malimovka
相关产品推荐
相关产品推荐

