0

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

没有名为“bogus”的文件夹,所以我希望得到“404 not found”响应,而是 Apache 将请求发送到 /index.php(确实存在)。为什么?如何将其更改为响应“未找到 404”?

我想,理论上,Apache 这样做是为了让我为文件夹“bogus”(但它不存在)生成一个自定义索引页面。但在实践中,通过返回一个 200 响应的页面,它会给搜索引擎和意外访问者造成混乱。我在“index.php”中的 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。

4

2 回答 2

1

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

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

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

于 2017-12-12T02:51:16.597 回答
0

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

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

于 2017-12-11T22:12:48.820 回答