使用PHP的Apache提供基本文件而不是404

时间:2017-12-11 21:53:29

标签: php apache .htaccess http-status-code-404 pathinfo

问题:假设网址正在请求不存在的文件,例如mydomain.com/index.php/bogus

没有名为' bogus'的文件夹。所以我希望找不到' 404'响应,但Apache将请求发送到/index.php(确实存在)。为什么?如何更改以回复未找到404'?

我认为,理论上,Apache这样做是为了让我为文件夹生成一个自定义的索引页面' bogus' (但不存在)。但实际上,通过返回200响应的页面,它会引起搜索引擎和意外访问者的混淆。我的PHP代码在' index.php'不期望这个URL,因此它在动态导航例程中生成断开的链接。

我尝试禁用索引(Option -Indexes)和目录索引(DirectoryIndex disabled)并删除.htaccess(AllowOverride None)。这些都没有改变回应。我已经搜索了stackoverflow,它有很多"如何提供文件而不是404"但事实恰恰相反:我希望Apache返回404,而不是从文件系统中的较高位置提供PHP文件。

我的服务器环境是Windows Server 2008,Apache 2.2.22和PHP 5.3。没有mod_rewrite。

2 个答案:

答案 0 :(得分:1)

可行的解决方案是将AcceptPathInfo Off添加到Apache配置文件中。 此指令控制是否接受或拒绝包含跟随实际文件名(或现有目录中不存在的文件)的尾随路径名信息的请求。可以通过CGI(通用网关接口)规范使脚本可以使用尾随路径名信息。

  • 当AcceptPathInfo为' Off'时,CGI解析会将URL保留为一个长字符串,并在文件系统中查找要匹配的文件。
  • 当AcceptPathInfo为' On'时,CGI会将URL分隔为脚本名称PLUS以下字符是脚本可用的信息。

Apache核心文档有更多信息:http://httpd.apache.org/docs/2.0/mod/core.html#acceptpathinfo

答案 1 :(得分:0)

您没有名为index.php的文件夹,您有一个具有该名称的文件。我认为apache会找到该文件并确定它已找到所请求的内容,因此它会提供该文件。

在index.php文件中,您可以检查$_SERVER['REQUEST_URI']是否为index.php的有效请求。如果它不是有效请求,您可以使用PHP http_response_code(404)header()函数使index.php为无效URL返回404。