如何使用PHP获取Apache HTTP响应代码(或服务器响应的第一行)

How to get Apache HTTP response code (or first line of server response) with PHP

提问人:Jeff 提问时间:10/21/2012 最后编辑:Jeff 更新时间:10/21/2012 访问量:1610

问:

如何获取服务器的 HTTP 响应的第一行(在我的情况下为 Apache2)以在我的 PHP 脚本中使用?例如:

HTTP/1.1 200 OK
HTTP/1.1 404 Not Found
Etc.

或者更好的是,只获取我的服务器发送到客户端的 HTTP 响应代码。

令我惊讶的是,_SERVER 美元没有它。http_response_code() 似乎只有在 PHP 首先设置响应代码时才会获得响应代码。apache_response_headers() 似乎没有。get_headers() 似乎需要额外的步骤/连接(如果我错了,请纠正我)。

如果我在httpd.conf中设置,我可以用来从PHP获取响应代码,但是有其他方法吗?ErrorDocument 403 /index.php$_SERVER["REDIRECT_STATUS"]

编辑:

为了清楚起见,我发现除了响应的第一行或响应代码之外,几乎返回所有数据都很奇怪。也许这是HTTP协议/服务器技术/PHP之间的一般限制?也许我不应该尝试在我的PHP脚本中访问此信息?$_SERVER

php apache2 httpresponse

评论

0赞 Basic 10/21/2012
当然,如果你的脚本正在运行,它是 200,除非你自己将其设置为其他内容,或者你在错误文档中?

答:

0赞 Sven 10/21/2012 #1

您是询问远程主机还是本地计算机的响应代码?在第一种情况下,您可以使用设置了标头选项的 CURL 请求“ping”计算机,并检索响应标头的各种设置。

评论

0赞 Jeff 10/21/2012
我要求提供本地服务器的响应代码。因此,cURL 不是我所追求的。
1赞 CodeAngry 10/21/2012 #2

更新:不,这是不可能的除非您代理自己的请求。将您的请求发送到面向公众的 URL,然后将它们重定向到内部变体,您将在此过程中看到标头。但这并非易事,而且对性能也很费力。或者,您可以编写一个 Http 服务器扩展,看看它会将您带到哪里:)

例:

  • 请求进入 /page.html
  • 将 ?proxy=true 附加到 /page.html?proxy=true
  • 尝试在内部加载新 URL,将原始请求转发给内部处理程序
  • 检查所有 $_GET['proxy'] === 'true' 请求来自本地 IP 的内部处理
  • 如果您有代理 === true,则以通常的方式处理此问题
  • /page.html 从 /page.html?proxy=true 获取数据
  • 日志标头
  • 将数据转发回原始客户端
  • (如果做错了,不是很容易,而且对性能很费力)

第一次尝试回答

http://php.net/manual/en/function.headers-list.php - 可能是这个?

但这适用于您将要发送的标头......

register_shutdown_function(function(){
    // Headers are really sent here, do some comparison
    var_dump(headers_list());
});

.htaccess 变体,将所有丢失的文件定向到 index.php。

RewriteEngine on
#If handler file is missing, pull index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php [L,NC]

试试这个。

评论

0赞 Jeff 10/21/2012
我看了那个功能,但你是对的。它不会获取服务器的响应标头。
0赞 CodeAngry 10/21/2012
@Jeff 除非您自己执行请求,否则无法获取服务器的响应标头。只需在发送一些输出后尝试此功能即可。并比较东西......发送输出标头时,不再更改。确保如果您对自己的 URL 发出请求,您不会陷入循环:)
0赞 Jeff 10/21/2012
我不明白为什么我可以获得所有其他 _SERVER 美元的变量,但不能获得响应的第一行。也许第一行/响应代码很特殊。
0赞 CodeAngry 10/21/2012
@Jeff 第一行是“HTTP/Ver.Ver CODE 错误消息”。默认情况下,它是 200,但可以因您或内部服务器错误而更改。您可以在发送后从服务器日志中跟踪它。
0赞 Jeff 10/21/2012
唯一返回的是数组中的 1 个项目:,所以我假设它只考虑了 PHP 设置的标头。要么是这样,要么是我做错了什么。string(23) "Content-type: text/html"headers_list()