Apache Clean URL配置导致访问404页面时出现内部服务器错误
MAMP环境下Clean URL规则与404页面冲突导致500错误的修复
环境与现有配置
- 项目目录结构:
project — publicFolder(.htaccess和404.php都在这里) — privateFolder - 当前
.htaccess代码:<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME}!-f RewriteCond %{REQUEST_FILENAME}!-d RewriteRule (.+) $1.php [NC,L] </IfModule> ErrorDocument 404 http://localhost:8888/project/public/404.php
问题表现
保留上面的重写规则代码块时,访问不存在的URL本该触发404,结果却抛出内部服务器错误;删掉重写规则后,404页面就能正常显示。查看Apache错误日志,提示重定向次数超限:
[core:error] [pid 2575] [client ::1:51038] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
问题根源
你写的Clean URL规则有漏洞:当访问一个不存在的路径(比如/non-existent),规则会把它重写成/non-existent.php,但这个文件也不存在,Apache就会再次触发重写规则,反复给路径加.php后缀,直到达到内部重定向的上限,直接爆500错误。而且你的ErrorDocument用了绝对URL,会触发外部跳转,但在重写循环没被打断前,根本轮不到404规则生效。
修复方法
给重写规则加一个目标文件存在性检查,只有当对应的.php文件真的存在时才执行重写,否则直接放行让Apache触发404。同时把ErrorDocument改成相对路径,避免不必要的外部跳转:
修改后的.htaccess代码:
<IfModule mod_rewrite.c> RewriteEngine On # 先判断原路径不是文件/目录,再判断加.php后的文件存在,才执行重写 RewriteCond %{REQUEST_FILENAME}!-f RewriteCond %{REQUEST_FILENAME}!-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule (.+) $1.php [NC,L] </IfModule> # 用相对路径指定404页面,适配本地环境 ErrorDocument 404 /project/public/404.php
核心修改说明:
- 新增
RewriteCond %{REQUEST_FILENAME}.php -f:检查添加.php后缀后的文件是否真实存在,不存在就跳过重写,直接进入404流程。 - 把
ErrorDocument的绝对URL换成相对路径/project/public/404.php:避免外部重定向的额外问题,路径要和你的项目结构对应上。
内容的提问来源于stack exchange,提问作者paulo77
相关产品推荐
相关产品推荐

