使用.htaccess将.php结尾URL定向到自定义404页面导致页面失效
问题分析与解决
问题根源
添加的RewriteRule .php$ - [R=404,L]规则会匹配所有以.php结尾的URL,包括你正常存在的index.php,所以访问它时直接被强制返回404。
更关键的是,你的自定义404页面/exception/404.php本身也是.php结尾,当服务器触发404后尝试调用这个页面时,又被这条规则命中,导致服务器找不到可用的错误处理页面,就出现了那句“在尝试使用ErrorDocument处理请求时,遇到了404 Not Found错误”。
修复方案
你需要让这条规则只作用于不存在的.php文件,或者直接排除自定义错误页面的路径。
方案1:仅针对不存在的.php文件返回404
修改规则,先判断文件是否存在,不存在才触发404:
RewriteEngine On ErrorDocument 404 /exception/404.php # 匹配以.php/结尾的URL返回404 RewriteRule .php/$ - [R=404,L] # 仅当对应的.php文件不存在时,才返回404 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .php$ - [R=404,L]
方案2:排除自定义错误页面路径
如果你的自定义404页面是固定路径,可以直接排除它,避免被规则匹配:
RewriteEngine On ErrorDocument 404 /exception/404.php # 匹配以.php/结尾的URL返回404 RewriteRule .php/$ - [R=404,L] # 排除/exception/路径下的.php文件 RewriteCond %{REQUEST_URI} !^/exception/ # 匹配其他.php结尾的URL返回404 RewriteRule .php$ - [R=404,L]
验证效果
- 访问
speedcubing.top/index.php:正常显示首页(因为文件存在,或路径被排除) - 访问
speedcubing.top/index.php/:显示自定义404页面 - 访问不存在的
xxx.php:返回自定义404页面,不会出现二次错误
内容的提问来源于stack exchange,提问作者speedcubing
相关产品推荐
相关产品推荐

