6

有很多方法可以编写 HTTP 状态标头:

HTTP/1.1 404 Not Found
Status: 404
Status: 404 Not Found

但哪种方式在语义上正确且符合规范?

编辑:通过状态标题我的意思是使用诸如 PHP 之类的函数header()

4

4 回答 4

4

一段时间后添加一些信息,因为我在研究相关内容时遇到了这个问题。

我相信 Status 标头字段最初是作为 CGI 规范 RFC 3875 的一部分发明的:

https://www.rfc-editor.org/rfc/rfc3875#section-6.3.3

去引用:

The Status header field contains a 3-digit integer result code that
indicates the level of success of the script's attempt to handle the
request.

   Status         = "Status:" status-code SP reason-phrase NL
   status-code    = "200" | "302" | "400" | "501" | extension-code
   extension-code = 3digit
   reason-phrase  = *TEXT

它允许 CGI 脚本向 Web 服务器返回一个状态代码,该代码覆盖 HTTP 状态行中的默认值。通常,服务器会缓冲脚本的结果并为客户端发出一个新的标头。这是一个有效的 HTTP 标头,它以修改后的 HTTP 状态行开头并省略脚本“​​Status:”标头字段(以及 RFC 规定的一些其他转换)。

因此,您的所有示例在CGI 脚本中都是有效的,但只有第一个在 HTTP 标头中真正有效。后两者仅对来自 CGI 脚本(或者可能是 FastCGI 应用程序)有效。

当 CGI 脚本生成完整且有效的 HTTP 标头时,CGI 脚本也可以在“非解析标头”(NPH)模式下运行,Web 服务器将其逐字传递给客户端。因此,这不应包含 Status: 标头字段。

请注意,我感兴趣的是,如果 NPH 脚本有点错误并发出 Status: 标头字段,可能是 HTTP 状态行之外的哪个状态应该获胜。我找不到任何明确的指示,所以我怀疑它留给解析输出的任何东西的实现,无论是客户端还是服务器。

于 2014-02-27T15:41:39.240 回答
3

由于https://www.rfc-editor.org/rfc/rfc2616#section-6更具体地说https://www.rfc-editor.org/rfc/rfc2616#section-6.1没有提到使用“状态: " 当指示状态代码时,由于http://www.iana.org/assignments/message-headers/message-headers.xml的官方标题列表没有提到“状态”,我倾向于相信它不应该作为标题提供。

于 2013-06-17T00:29:35.403 回答
1

我找到的最接近答案的是Fast CGI spec,它规定通过 Status 和 Location 标头设置状态代码。

于 2009-06-26T12:24:49.053 回答
0

其中很多都是任意字符串,但这里有 w3c 对常用字符串的规范

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

于 2009-06-17T22:36:08.040 回答