当一个请求有多个时,有效的HTTP状态代码是否与给定的最后一个相同?

时间:2016-10-26 14:59:19

标签: http

HTTP HEAD的PHP代码段:

$context  = stream_context_create (
Array
(
    'http' => Array ('method' => 'HEAD')
));

$fd = fopen ("http://google.com", 'rb', false, $context);

print_r (stream_get_meta_data ($fd));

我对状态代码感兴趣。以下是

的结果
Array
(
    [wrapper_data] => Array
        (
            [0] => HTTP/1.0 302 Found
            [1] => Cache-Control: private
            [2] => Content-Type: text/html; charset=UTF-8
            [3] => Location: http://www.google.co.uk/?gfe_rd=cr&ei=jsMQWK3GAarA8gfKnbGQAg
            [4] => Content-Length: 261
            [5] => Date: Wed, 26 Oct 2016 14:54:06 GMT
            [6] => HTTP/1.0 200 OK
            [7] => Date: Wed, 26 Oct 2016 14:54:06 GMT
            [8] => Expires: -1
            [9] => Cache-Control: private, max-age=0
            [10] => Content-Type: text/html; charset=ISO-8859-1
            [11] => P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."
            [12] => Server: gws
            [13] => X-XSS-Protection: 1; mode=block
            [14] => X-Frame-Options: SAMEORIGIN
            [15] => Set-Cookie: NID=89=Mmm0qhGNf70J0iWVbQO_whrKBG3-RNGXpkKBm9DorsWkEzMMXQfZ5qC9s5MhVwHrRXYPFmi6Q_5B0h1au7zLKDwBmgtmTPzljoQcG_jm7qqupQjR6YO38TXmnTQMNskH; expires=Thu, 27-Apr-2017 14:54:06 GMT; path=/; domain=.google.co.uk; HttpOnly
            [16] => Accept-Ranges: none
            [17] => Vary: Accept-Encoding
        )

    [wrapper_type] => http
    [stream_type] => tcp_socket/ssl
    [mode] => rb
    [unread_bytes] => 0
    [seekable] => 
    [uri] => http://google.com
    [timed_out] => 
    [blocked] => 1
    [eof] => 
)

请注意以下事项:

wrapper_data[0] => HTTP/1.0 302 Found
wrapper_data[3] => Location: http://www.google.co.uk/?gfe_rd=cr&ei=jsMQWK3GAarA8gfKnbGQAg
wrapper_data[6] => HTTP/1.0 200 OK

一般来说,确定有效(用户将在浏览器中看到的内容)HTTP状态代码的正确程序是什么?

我很想简单地选择匹配/^HTTP\/[\d\.]+ (\d+)/的最后一行,这是一直有用还是天真?

3 个答案:

答案 0 :(得分:0)

我找不到关于此的文档,但看起来wrapper_data数组按顺序填充。

首先,您获得重定向响应(302),然后是实际响应(200)。这意味着您可以从HTTP/开始的最后一个标题开始阅读。

你肯定没有得到所有这些标题以响应一个请求,而是包装器透明地执行重定向的请求,并将第二个响应的标题附加到第一个响应的标题。

答案 1 :(得分:0)

302的效果是发送了一个新请求,因此在这种情况下确实有两个请求和两个响应。除非第二个请求失败(没有响应),否则第一个状态代码与用户无关。

几乎在所有情况下,将最后收到的响应的状态代码视为相关的响应是安全的(除非调试或跟踪是您之后的事情)。之前的任何状态代码只需要到达最后一个状态代码。

答案 2 :(得分:0)

如果除了最后一个响应之外的所有响应都在100-199范围内(即临时响应集),则唯一一次对单个请求获得超过1个有效响应的时间。例如,一个100继续响应POST,然后是POST本身的实际结果响应。