【问题标题】:Apache with PHP serves a base file instead of 404带有 PHP 的 Apache 提供基本文件而不是 404
【发布时间】:2018-05-25 12:23:46
【问题描述】:

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

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

我想,理论上,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。

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,这是正确的。我确实有一个名为“index.php”的主页,而不是一个文件夹。我试图弄清楚为什么它在这种情况下运行而不是 Apache 自己返回 404。
    • 我不确定为什么它自己也不返回 404。 IIS 10 对我来说也是如此,所以也许这是预期的行为。你可以试试serverfault.com
    • 显然这种行为是出于历史原因。 serverfault.com/questions/627903/… 有关于 PATH_INFO 的有用背景
    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2010-09-28
    • 1970-01-01
    • 2011-01-13
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多