【问题标题】:404 header - HTTP 1.0 or 1.1?404 标头 - HTTP 1.0 还是 1.1?
【发布时间】:2011-02-15 16:43:20
【问题描述】:

为什么我能找到的几乎每个示例(包括大约一年前的this question)都说,当我们真正使用 HTTP 1.1 十多年时,404 标头应该是HTTP/1.0 404 Not Found?有什么理由不发HTTP/1.1 404 Not Found吗?

(没那么重要……我只是好奇。)

【问题讨论】:

  • 1.0 的 Google 搜索结果约为 1100 万条,1.1 的搜索结果约为 430 万条。我猜这意味着使用1.0
  • 那个问题并没有说标头应该是 HTTP/1.0。它仅在该示例中使用。所以不要假设 =)

标签: http http-status-code-404 header


【解决方案1】:

在 PHP 中你可能应该使用:

header( $_SERVER['SERVER_PROTOCOL']." 404 Not Found", true );

甚至更好

header( $_ENV['SERVER_PROTOCOL']." 404 Not Found", true );

(如果支持),因此将它留给网络服务器使用哪个协议。

实际上,如果你将状态码作为第三个参数传递,你可以在第一个参数中传递任何你想要的,只要它不为空,剩下的由 PHP 来做。见http://php.net/header

header("foobar", true, 404 );

另外:您不能从客户端请求某个协议版本,因为事务是基于跳到跳的,而不是端到端的。服务器和您的浏览器很可能使用 HTTP/1.1,但如果中间的代理仅使用 HTTP/1.0,那么您将从客户端看到的就是这样。

【讨论】:

  • 有没有办法获取客户端发送的 raw 标头?我的意思是逐行标题。
  • @Pacerier 我不知道 RAW 标头,但它们都是 $_SERVER 数组的一部分。
  • 不,我的意思是我想在将文本标题解析到数组之前获取它们。
  • php.net/manual/en/function.getallheaders.php 或解析 $_SERVER(以 HTTP_ 开头的键)
  • 在什么情况下支持-$_ENV['SERVER_PROTOCOL']?我在 php 5.5 上的 apache 2.4 上只有一个 undefined
【解决方案2】:

HTTP版本的使用可以基于以下几个因素:

  • 您的 Web 服务器支持 HTTP 1.0 或 1.1
  • Web 浏览器对 HTTP 1.0 或 1.1 的支持
  • 作为 Web 开发人员,您对使用哪个协议版本的偏好

现代浏览器可以同时支持1.0和1.1,客户端和服务器都会选择同时支持的最高版本。可以找到2个协议的主要区别:http://www8.org/w8-papers/5c-protocols/key/key.html

但是,404 Not Found 的用法没有关键区别。但是,请务必为您的整个网站保持一致。即,如果您使用 HTTP/1.1,您将在整个网站中使用它。

【讨论】:

    【解决方案3】:

    这并不重要。客户端负责告诉服务器它使用哪个版本的 HTTP。然后,服务器应该用相同的版本来回答。这并不总是发生;我刚从服务器得到这个响应:

    $ telnet example.com 80
    Trying 123.123.123.123...
    Connected to example.com.
    Escape character is '^]'.
    GET /fork HTTP/1.0
    
    HTTP/1.1 404 Not Found
    Content-Length: 1635
    Content-Type: text/html
    Server: Microsoft-IIS/6.0
    X-Powered-By: ASP.NET
    Date: Tue, 04 May 2010 22:30:36 GMT
    Connection: close
    

    我要求服务器使用 HTTP 1.0,但它继续并以 HTTP 1.1 响应。

    【讨论】:

      【解决方案4】:

      如果请求是 HTTP 1.0,我会认为响应应该是 HTTP/1.0 404 Not Found,如果请求是 HTTP 1.1,那么响应应该是 HTTP/1.1 404 Not Found

      实际上,服务器返回预设响应会更容易,并且 HTTP 1.0 响应将被 1.0 和 1.1 客户端理解,因此返回它是最安全的。如果您知道客户端理解 1.1(例如,因为这是它所要求的),那么 1.1 响应应该有效。

      可以说,谨慎行事并发送 1.0 响应。

      【讨论】:

      • 是的,当您不使用任何 1.1 功能时,无需使用 1.1
      【解决方案5】:

      查看 1.1 和 1.0 RFC,404 都存在于两者中 - 因此,服务器与客户端通信它在 http 1.1 上运行可能没有其他原因。

      也就是说 - 如果服务器通过 Http 1.1 响应 404,这意味着它本可以返回 410 - Gone 来指示曾经存在但不再存在的资源。此状态代码不是 1.0 的一部分,因此此信息可能对客户端(尤其是网络爬虫)有用。

      编辑

      对不起 - 这个答案可能是相反的答案!我认为您可能只能指望公共网络服务器的数量,这些服务器会费心记住曾经存在但不再存在的所有资源(我绝不会将其编码到我的网络服务器中!) -因此,因此最好使用 1.0 404 进行响应,以表明“它只是不存在”而不是“它不在这里,但是站点周围的其他东西可能曾经存在但不再存在 - 在这种情况下,我可以发送给你410'。

      还有一个事实是,您允许仅 1.0 的客户端使用您的网站。

      也就是说 - 这有点迂腐。

      【讨论】:

        【解决方案6】:

        使用现代版本的 PHP,您还可以使用 http_response_code 函数并完全回避问题!

        我也喜欢这种方法,因为这意味着在响应消息中不存在拼写错误的风险。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-07
          • 2010-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-21
          • 2017-03-13
          相关资源
          最近更新 更多