Apache mod_rewrite规则循环添加.php后缀致500错误求助
解决Apache mod_rewrite反复追加后缀导致500错误的问题
你的问题出在内部重写规则使用了%{REQUEST_URI}作为重写目标,当访问类似example.com/index/file这类不存在的路径时,规则会反复追加.php后缀,直到达到Apache的重写次数上限触发500错误。
问题原因
当请求/index/file时,第一次重写会将URI改为/index/file.php,但由于%{REQUEST_URI}会随重写更新为新的URI,下一次重写时会基于/index/file.php再次追加.php,变成/index/file.php.php,以此循环直到超过重写次数限制。
修复后的.htaccess配置
修改内部重写规则,使用反向引用匹配无后缀的请求路径,避免循环:
Options +FollowSymLinks -MultiViews RewriteEngine On RewriteBase / # External Redirect - 移除已有的.html/.php后缀 RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.html [NC] RewriteRule ^ %1 [R=302,L,NE] RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC] RewriteRule ^ %1 [R=302,L,NE] # Internal Redirect - 仅对无后缀的请求尝试追加.html/.php # 检查请求路径不是真实目录,且对应的.html文件存在 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.html -f RewriteRule ^([^.]+)$ $1.html [L] # 检查请求路径不是真实目录,且对应的.php文件存在 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^([^.]+)$ $1.php [L] # Error Documents ErrorDocument 403 /errors/403.php ErrorDocument 404 /errors/404.php ErrorDocument 500 /errors/500.php
关键修改说明
- 添加
RewriteCond %{REQUEST_FILENAME} !-d:确保请求的路径不是真实目录,避免对存在的目录误处理。 - 使用
^([^.]+)$匹配无后缀的请求URI,通过反向引用$1拼接后缀,替代原来的%{REQUEST_URI},防止循环追加。 - 仅当对应的
.html或.php文件真实存在时才执行重写,不存在的路径会直接触发404错误。
内容的提问来源于stack exchange,提问作者EthanBlaisAlarms
相关产品推荐
相关产品推荐

