什么是php $ _SERVER ['REDIRECT_STATUS']?

时间:2014-06-24 04:42:10

标签: php http-headers

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

2 个答案:

答案 0 :(得分:3)

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进程,即Web服务器以受控方式处理请求,而不是以其他方式处理,直接访问这些CGI脚本。

历史上,您将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。 / em>的

答案 1 :(得分:1)

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