我注意到GET /
向某些网络服务器(例如来自知名搜索提供商)发送 (+CRLF) 会产生一条HTTP/1.0 200 OK
消息。其他网络服务器会响应HTTP/1.0 400
错误。
据我所知,即使 HTTP/1.0 也需要版本字段。GET /
(没有协议和主机)是标准化、有效的缩短 GET 请求吗?
经过一番挖掘,我发现 1991 年的 HTTP/0.9 定义如下:
- 该请求由单词“GET”、一个空格、文档地址、[...]组成。
- 文档地址将由单个单词组成(即没有空格)。如果在请求行中发现任何其他单词,则必须将其忽略,否则将根据完整的 HTTP 规范进行处理
使用 HTTP/0.9 似乎可以实现该请求。一些来源称其为单行协议。不确定这是否是常识。我以前不知道也没有见过这种情况。Web 服务器是否应该遵守此 HTTP/0.9 请求?
答案1
没有版本号的请求是 HTTP/0.9 请求,也称为“简单请求”。如果支持,它将收到比 HTTP/1.0 或更高版本的请求更简单的响应。
RFC 1945(HTTP/1.0 规范)包含此类请求的定义(参见第 5 节)并要求服务器支持它们,但不鼓励客户端使用它们。
RFC 2068 和 RFC 2616(HTTP/1.1 规范的原始版本和第一个修订版本)不再包含此类请求的定义。他们表示,“强制遵守以前的版本超出了协议规范的范围。”但“在编写此规范时”,他们希望“商业 Web 服务器”继续支持 http/0.9 和 http/1.0。
2014 年 http/1.1 再次修订时,被拆分为一系列 RFC(RFC 7230 至 7235),而不是一个大文档。RFC 7230 建议支持基于名称的虚拟主机的服务器不要支持 http/0.9 请求。
网络服务器是否可以满足此 HTTP/0.9 请求?
互联网是建立在“粗略的共识和运行代码”之上的。IETF 尽最大努力记录该共识并提出建议,但最终提供何种程度的向后兼容性取决于各个实施者的判断。
实际上,现代网络严重依赖基于名称的虚拟托管。因此,即使网络服务器软件理解这些古老的请求,也很有可能不会返回所需的文档,