【问题标题】:What is php $_SERVER['REDIRECT_STATUS']?什么是 php $_SERVER['REDIRECT_STATUS']?
【发布时间】:2014-06-24 04:42:09
【问题描述】:

使用 php,我可以在 $_SERVER 数组中看到索引“REDIRECT_STATUS”,但 php.net 没有提及它。我有一个抛出 404 的自定义错误页面,但“REDIRECT_STATUS”仍然是 200。那么状态代码到底指的是什么?

【问题讨论】:

  • This should shed some light(取自 php.net $_SERVER 手册)
  • 是的,我看到了,但它并没有以我能理解的方式真正解释。
  • 这些变量来自任何正在运行的 PHP ......在你的情况下,可能是你的网络服务器。你用的是什么服务器?
  • 正如 Brad 所说,这是由 Web 服务器设置的(PHP 只是使其在 $_SERVER 超全局中可用)——它不是 HTTP 请求标头。对于 Apache,如果是自定义 404 ErrorDocument,则应将其设置为 404。但是,如果它不是 Apache,那么它可能不是。 This old bug post 似乎表明 lighttpd 在 404 的情况下将其设置为 200。
  • @w3dk - 响应晚了大约一年,但它是 Apache (v2.4),不,它没有抛出 404,这是我所期望的,也是我发现它如此奇怪的原因。

标签: php http-headers


【解决方案1】:

php-src code暗示documentation link,即

<p>For more information as to <i>why</i> this behaviour exists,
see the <a href=\"http://php.net/security.cgi-bin\">\
manual page for CGI security</a>.</p>\n\

阅读有关 CGI 安全性的信息。使用 REDIRECT_STATUS 变量 - 它不是 HTTP 标头,而是从 Web 服务器传递到 CGI 程序的变量,在这种情况下是 php-cgi 或 php-fpm 进程 - 你告诉 php-cgi 或 php-fpm通过直接访问这些 CGI 脚本,处理请求已由 Web 服务器以受控方式而不是其他方式处理。

过去,您将 Web 服务器配置为处理特殊目录中的 CGI 二进制文件(例如 $DOCROOT/cgi-bin),并且您可以通过某个 URL http://SERVERNAME/cgi-bin/ 访问所有 CGI 脚本。

现在,如果您通过这样的(直接)URL http://SERVERNAME/cgi-bin/php-cgi/PATH_TO_PHP_SCRIPT 调用 PHP CGI 程序,php-cgi 的默认行为是处理文档 /PATH_TO_PHP_SCRIPT,因此可能会绕过 Web 服务器的访问控制。 /PATH_TO_PHP_SCRIPT 文档将被处理,尽管服务器可能不允许 /PATH_TO_PHP_SCRIPT,因为请求已经离开 Web 服务器并进入 PHP 进程。在 php 的帮助下,这样的服务器会泄漏信息,您需要为所有 PHP 脚本设置另一个访问检查层。

要停止这种行为,您可以将 PHP-CGI 程序配置为仅处理设置了 REDIRECT_STATUS 标头的请求,外部客户端无法在直接请求中设置。只有 Web 服务器(位于客户端和 php 之间)可以设置此标头,并且 Web 服务器会建议 HTTP 状态(例如 200、404、403 或您喜欢的任何内容)并允许 PHP 处理此状态。但是,即使这个标头的纯粹存在也会通知 PHP 进程,该请求已被 Web 服务器以常规方式处理。

意见:防止这种用法的更好方法是,将 Web 服务器配置为禁止通过默认 /cgi-bin/ 路径直接调用 PHP CGI。

【讨论】:

    【解决方案2】:

    我以前从未使用过此 HTTP 标头,但是,我可以理解 @Darren 发布的 URL 是您可以将所有错误(导致 4xx 或 5xx HTTP 标头的错误)指出给 只有一个 php 文件。在该 php 文件中,您可以通过访问此 REDIRECT_STATUS HTTP 标头来了解发生了哪个特定错误。

    【讨论】:

    • REDIRECT_STATUS 不是“HTTP 标头”。 HTTP 请求标头转换为 $_SERVER 数组中的 HTTP_&lt;header&gt; 元素。 REDIRECT_STATUS 由服务器设置(然后 PHP 会在 $_SERVER 超全局中使用它)。在 Apache 的情况下,这是一个环境变量,只要有内部子请求(包括重写,但不包括重定向)就设置它,并在发生错误的情况下设置为 HTTP 状态代码(内部子请求在自定义错误文档)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2014-12-17
    • 2017-12-12
    • 1970-01-01
    • 2018-12-04
    相关资源
    最近更新 更多