Htaccess RewriteRule规则冲突求助:第二条规则无法生效
解决.htaccess RewriteRule规则匹配优先级问题
当前第一条规则的正则表达式^([a-z-]+)/([a-z-]+)-([0-9]+)$会匹配所有形如/xxx/yyy-xxxx的URL,包括/james/year-2023——因为([a-z-]+)可以匹配"year",导致请求被第一条规则优先处理,第二条规则永远无法触发。
方案1:调整规则顺序(推荐)
RewriteRule按从上到下的顺序匹配规则,带[L]标记的规则匹配成功后会停止后续处理。把更具体的第二条规则放在第一条前面即可:
RewriteRule ^([a-z-]+)/year-([0-9]+)$ /year.php?name=$1&y=$2 [L,QSA,NC] RewriteRule ^([a-z-]+)/([a-z-]+)-([0-9]+)$ /all.php?name=$1&m=$2&y=$3 [L,QSA,NC]
此时访问/james/year-2023会先匹配第二条规则,跳转到year.php;访问/james/january-2023则匹配第一条规则,跳转到all.php。
方案2:修改第一条规则的正则表达式
在第一条规则的第二个分组前添加负向先行断言,排除"year"字符串,确保仅当第二部分不是"year"时才触发第一条规则:
RewriteRule ^([a-z-]+)/(?!year)([a-z-]+)-([0-9]+)$ /all.php?name=$1&m=$2&y=$3 [L,QSA,NC] RewriteRule ^([a-z-]+)/year-([0-9]+)$ /year.php?name=$1&y=$2 [L,QSA,NC]
(?!year)表示当前位置后不能是"year",因此/james/year-2023不会被第一条规则匹配,转而由第二条规则处理。
内容的提问来源于stack exchange,提问作者M.Nguyen
相关产品推荐
相关产品推荐

