You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:05:31