404标头 - HTTP 1.0还是1.1?

时间:2010-05-04 22:25:07

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

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

(并不是那么重要......我大多只是好奇。)

6 个答案:

答案 0 :(得分:28)

在PHP中你应该使用:

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

甚至更好

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

(如果支持),因此将其留给Web服务器使用哪种协议。

实际上,如果你将状态代码作为第三个参数传递,你可以在第一个参数中传递你想要的任何东西,只要它不是空的,PHP将完成其余的工作。见http://php.net/header

header("foobar", true, 404 );

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

答案 1 :(得分:6)

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

  • 您的Web服务器支持HTTP 1.0或1.1
  • 网络浏览器支持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,则在整个网站中使用它。

答案 2 :(得分:2)

这一切并不重要。客户端负责告诉服务器它使用的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进行响应。

答案 3 :(得分:2)

我认为如果请求是HTTP 1.0,则响应应为HTTP/1.0 404 Not Found,如果请求为HTTP 1.1,则应为HTTP/1.1 404 Not Found

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

可以说,安全地播放并发送1.0响应。

答案 4 :(得分:1)

同时查看1.1和1.0 RFC,两者都有404 - 因此,除了服务器与客户端进行通信之外,它可能没有其他原因可以在http 1.1上运行。

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

编辑

对不起 - 这个答案可能正在回答相反的问题!我估计你可能只需要几手牌就可以完全忘记曾经存在的所有资源以及不再存在的公共网络服务器的数量(我不会将其编码到我的网络服务器中!) - 因此,最好用1.0 404作为回应来表示'它不存在',而不是'那里不存在',但网站周围的其他东西可能过去但不再 - 在这种情况下我可能已经发送给你了一个410'。

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

那说 - 这有点迂腐。

答案 5 :(得分:0)

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

我也喜欢这种方法,因为这意味着在响应消息中没有打字错误的风险。