有很多方法可以编写 HTTP 状态标头:
HTTP/1.1 404 Not Found
Status: 404
Status: 404 Not Found
但哪种方式在语义上正确且符合规范?
编辑:通过状态标题我的意思是,使用诸如 PHP 之类的函数header()
。
有很多方法可以编写 HTTP 状态标头:
HTTP/1.1 404 Not Found
Status: 404
Status: 404 Not Found
但哪种方式在语义上正确且符合规范?
编辑:通过状态标题我的意思是,使用诸如 PHP 之类的函数header()
。
一段时间后添加一些信息,因为我在研究相关内容时遇到了这个问题。
我相信 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 状态行之外的哪个状态应该获胜。我找不到任何明确的指示,所以我怀疑它留给解析输出的任何东西的实现,无论是客户端还是服务器。
由于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的官方标题列表没有提到“状态”,我倾向于相信它不应该作为标题提供。
我找到的最接近答案的是Fast CGI spec,它规定通过 Status 和 Location 标头设置状态代码。
其中很多都是任意字符串,但这里有 w3c 对常用字符串的规范