非存在目录重定向异常(返回200而非404)技术求助
你遇到的是Apache服务器AcceptPathInfo指令默认开启导致的路径解析异常:当这个指令处于开启状态时,服务器会允许在PHP脚本文件名后追加任意路径片段(比如shooting.php/nonexistfolder),此时服务器会把shooting.php判定为有效脚本并执行,后面的nonexistfolder会被当作PATH_INFO变量传递给脚本。但你的脚本没有处理这种无效路径的情况,所以返回200状态码;同时如果脚本里用了相对路径的include操作,还会因为路径解析错误找不到目标文件。
下面是几种针对性的解决方案:
方案1:通过Apache配置禁用指定文件的路径追加
如果你的站点使用Apache服务器,可以在.htaccess文件(或httpd.conf配置文件)中添加规则,禁止shooting.php接受额外路径信息:
<Files "shooting.php"> AcceptPathInfo Off </Files>
如果要让所有PHP文件都禁用这个特性,可以改为全局规则:
AcceptPathInfo Off
配置生效后,再访问shooting.php/nonexistfolder这类路径,服务器会直接返回404。
方案2:在PHP脚本内主动拦截无效路径
如果你无法修改服务器配置,可以在shooting.php的开头添加代码,检查是否存在额外路径信息,一旦检测到就返回404:
// 检查是否有非空的额外路径信息 if (!empty($_SERVER['PATH_INFO']) && trim($_SERVER['PATH_INFO'], '/') !== '') { http_response_code(404); // 可以包含你的404页面模板,或者直接输出404内容 include('your-404-page.php'); exit; }
这样即使服务器允许追加路径,脚本也会主动拦截并返回正确的404状态。
方案3:用RewriteRule重定向无效请求
通过.htaccess的URL重写规则,直接匹配所有shooting.php后带额外路径的请求,返回404:
RewriteEngine On # 匹配shooting.php后面的任意路径片段,直接返回404 RewriteRule ^shooting.php/.+$ - [R=404,L]
额外提示:解决包含文件找不到的问题
如果你的脚本里使用了相对路径的include(比如include('includes/header.php')),PATH_INFO会干扰PHP的当前工作路径,导致文件找不到。可以在脚本开头定义绝对路径来避免这个问题:
// 定义站点根目录的绝对路径 define('ROOT_DIR', dirname(__FILE__)); // 使用绝对路径包含文件 include(ROOT_DIR . '/includes/header.php');
内容的提问来源于stack exchange,提问作者olaf ernst

