.htaccess中部分RewriteRule突然失效,请求协助排查原因
针对你提到的第二条规则失效问题,从几个常见的排查方向入手:
目标文件路径是否存在
你的规则是把/pro/{tool}/{slug}/{action}重写到/pro/$1/$3.php,比如访问/pro/tool/my-slug/edit时,实际会请求/pro/tool/edit.php。先确认这个文件确实存在于对应目录,没有被移动、改名或者权限变更(比如服务器用户没有读取权限)。如果文件不存在,规则本身执行了但会返回404,看起来就像规则失效。规则顺序是否被干扰
检查.htaccess里的规则顺序,确保这条针对/pro/xxx/xxx/xxx的规则放在所有更宽泛的/pro/开头规则之前。比如如果前面有类似:RewriteRule ^pro/(.*)$ /pro/index.php [L]这种宽泛规则会先匹配所有
/pro/开头的请求,导致你的具体规则根本没机会执行。把更具体的规则放在前面是mod_rewrite的基本准则。是否存在子目录的.htaccess覆盖
如果/pro/目录下有自己的.htaccess文件,它会覆盖上级目录的规则设置。检查这个子目录里的.htaccess,看是否有禁用mod_rewrite、添加了冲突的规则,或者设置了RewriteOptions inherit导致规则继承出问题。测试正则匹配是否符合预期
可以用具体的测试URL验证正则是否能正确捕获分组:
比如访问/pro/tool/test-slug/do-action,规则里的分组应该是:- $1 =
tool - $2 =
test-slug - $3 =
do-action
对应的目标路径是/pro/tool/do-action.php。可以临时添加日志规则来验证(Apache 2.4+版本):
LogLevel alert rewrite:trace3通过服务器日志可以看到规则是否匹配、分组是否正确、目标路径是什么。
- $1 =
服务器配置是否变更
虽然第一条规则正常,但还是要确认:- 针对
/pro/目录的AllowOverride设置是否还是All或FileInfo(如果.htaccess在根目录,要确保根目录的AllowOverride允许mod_rewrite生效); - mod_rewrite模块是否依然启用(可以通过
apache2ctl -M命令查看)。
- 针对
内容的提问来源于stack exchange,提问作者santa

