.htaccess重写规则完全失效,请求排查方案与调试方法
排查.htaccess URL重写404问题及规则执行日志查看方法
排查建议
- 检查Apache
AllowOverride配置:确保网站根目录的Apache配置(httpd.conf或虚拟主机配置)中,AllowOverride设置为All(至少是FileInfo)。若该配置未开启,.htaccess内的重写规则会被忽略,这是导致404的常见原因。 - 优化重写规则匹配范围:当前规则仅匹配末尾无斜杠的URL,可修改为允许末尾可选斜杠的版本,覆盖更多请求场景:
同时添加RewriteRule ^screenshot-of-the-week/screenshot/([^/]+)/?$ /screenshot-of-the-week/screenshot/index.php?id=$1 [L][L]标志,确保匹配后终止后续规则执行,避免干扰。 - 验证文件权限:确认
/screenshot-of-the-week/screenshot/index.php的权限设置正确,Apache进程需具备读取和执行权限(推荐644或755),权限不足会导致规则执行后返回404。 - 排查子目录.htaccess干扰:若
/screenshot-of-the-week/screenshot/目录下存在其他.htaccess文件,可能会覆盖根目录规则,建议暂时移除该文件测试。 - 调整HTTPS跳转规则顺序:虽然HTTPS跳转应优先,但可尝试将其移至重写规则之后测试,确认是否因跳转后的规则重启导致匹配异常。
查看重写规则执行情况的方法
1. 启用Apache重写日志
- Apache 2.2及以下版本:在Apache配置文件中添加:
RewriteLog "/var/log/apache2/rewrite.log" RewriteLogLevel 3 - Apache 2.4及以上版本:改用
mod_log_config配置:
日志级别可设置为LogLevel alert rewrite:trace3trace1到trace8,级别越高细节越丰富。重启Apache后,访问目标URL,查看日志文件即可清晰看到规则匹配、重写的全过程,定位问题节点。
2. 用PHP输出服务器变量验证
在/screenshot-of-the-week/screenshot/index.php中添加以下代码,查看请求参数是否正确传递:
<?php echo "REQUEST_URI: " . $_SERVER['REQUEST_URI'] . "<br>"; echo "QUERY_STRING: " . $_SERVER['QUERY_STRING'] . "<br>"; echo "REDIRECT_QUERY_STRING: " . (isset($_SERVER['REDIRECT_QUERY_STRING']) ? $_SERVER['REDIRECT_QUERY_STRING'] : '未设置') . "<br>"; ?>
访问重写后的URL,通过输出结果判断规则是否实际执行、参数是否正确传递。
内容的提问来源于stack exchange,提问作者Nour
相关产品推荐
相关产品推荐

