httpd .htaccess重写规则异常 带日期路径错误跳转index而非list
问题根因
你遇到的问题核心是重写规则的正则缺少字符串结束锚点$。Apache的mod_rewrite模块按从上到下的顺序执行规则,命中带L(最后一条)标记的规则后就会终止后续匹配,没有结束锚点的短规则会提前拦截前缀匹配的长路径:
- v2版本把index规则放在前面,无锚点的index正则
^m/([a-zA-Z0-9]+)/?会匹配带日期路径的前缀/m/blas3as/,直接终止后续list规则的匹配,因此带日期的路径错误跳转到index - 即使是v1版本把list规则放在前面,无锚点的正则也存在潜在的路径匹配风险
重复书写RewriteEngine On不是核心问题,但属于冗余写法,全局声明一次即可。
修复后的正确配置
RewriteEngine On # 带日期的路径规则,优先匹配 RewriteRule ^m/([a-zA-Z0-9]+)/(\d{4}-\d{2}-\d{2})/?$ m/list.php?list_id=$1&date=$2 [QSA,L] # 无日期的路径规则,后序匹配 RewriteRule ^m/([a-zA-Z0-9]+)/?$ m/index.php?list_id=$1 [QSA,L]
规则说明
- 首尾锚点
^和$限定正则必须匹配完整的请求路径,彻底避免前缀误匹配问题 - 逻辑更复杂的带日期规则放在靠前位置,命中后通过
L标记终止后续匹配,不会执行多余规则 - 原有
QSA标记保留,可自动将原请求携带的查询参数附加到重写后的地址,兼容原有业务逻辑
修改后两个测试URL均可正常匹配对应规则:
http://www.example.com/m/blas3as匹配第二条规则,跳转至index.phphttp://www.example.com/m/blas3as/2021-01-01匹配第一条规则,跳转至list.php
内容的提问来源于stack exchange,提问作者WayOfLife
相关产品推荐
相关产品推荐

