两条RewriteRule重写规则匹配冲突,如何设置可使其相互独立生效?
问题根因
Apache mod_rewrite 的规则是按从上到下的顺序匹配的,你现有的第一条规则正则^health-institute-([a-zA-Z\-]+)-([a-zA-Z\-]+)$可以匹配所有health-institute-后接两个以-分隔的字母/连字符组合的路径,health-institute-app-mycity刚好符合这个规则的匹配逻辑,所以会优先命中第一条,永远不会走到第二条规则。
解决方法
方案1:调整规则顺序(最简单)
把更具体的app相关规则放在最前面,匹配到之后就会触发[L]标记停止后续规则校验,不会再匹配通用规则:
RewriteRule ^health-institute-app-([a-zA-Z\-]+)$ search.php?city=$1 [L] RewriteRule ^health-institute-([a-zA-Z\-]+)-([a-zA-Z\-]+)$ search.php?city=$1&speciality=$2 [L]
方案2:优化通用规则正则,排除app关键字
如果不想调整顺序,可以给第一条规则的第一个分组增加负向预查,排除匹配到app的情况:
RewriteRule ^health-institute-(?!app)([a-zA-Z\-]+)-([a-zA-Z\-]+)$ search.php?city=$1&speciality=$2 [L] RewriteRule ^health-institute-app-([a-zA-Z\-]+)$ search.php?city=$1 [L]
这里的(?!app)是负向先行断言,代表health-institute-后面紧跟的内容不能是app,就不会再误匹配app开头的路径。
内容的提问来源于stack exchange,提问作者narseoh
相关产品推荐
相关产品推荐

