HTTP 状态代码表示主机头损坏或缺失

HTTP 状态代码表示主机头损坏或缺失

对于通过 SNI 或 HTTP 主机标头发送错误主机名(或根本没有主机名)的客户端,是否存在适合使用的 HTTP 状态代码?

一个较旧的问题首先,它解决了此类请求如何发生以及为什么发生,以及如何在 Apache 中技术性地处理它们。但是,它没有解决响应状态代码的选择问题。

过去,我曾实现过一个 HTTP 代理,它会发送状态代码 502 和一个 HTML 页面,解释产生错误消息的原因。我使用 502 的理由是,我预计它主要是由于配置错误而导致的,这意味着代理无法找到合适的后端。事实上,更常见的情况是看到完全虚假的主机名。

是否有其他更合适的状态代码,并明确向客户端发出信号,表明该 IP 地址上的服务器无法识别通过 SNI 和/或 Host 标头发送的值?

答案1

RFC 6066 没有指定甚至建议在通过 SNI 发送的主机名与 HTTP Host 标头不匹配的情况下出现任何特定的 HTTP 错误。它如果 SNI 主机名不是服务器提供服务的主机名,则建议服务器中止 TLS 握手。第3节

如果服务器理解 ClientHello 扩展但不能识别服务器名称,则服务器应该采取以下两种操作之一:通过发送致命级别的 unrecognized_name(112) 警报中止握手或继续握手。

由于这种格式错误的请求可以通过 TLS 握手,并需要在 HTTP 中被拒绝,因此需要 HTTP 响应代码。在所有现有的响应代码中,只有一个真正适合这种情况:

6.5.1. 400 错误请求

400(错误请求)状态代码表示服务器由于某些被视为客户端错误(例如,格式错误的请求语法、无效的请求消息框架或欺骗性的请求路由)而无法或不会处理请求。

事实上,这是 RFC 7230 指定的响应。从第 5.4 节描述主机头:

对于任何缺少 Host 标头字段的 HTTP/1.1 请求消息以及包含多个 Host 标头字段或具有无效字段值的 Host 标头字段的任何请求消息,服务器必须使用 400(错误请求)状态代码进行响应。

我强烈推荐反对使用 502。它的语义表明服务器并且如果稍后再尝试,请求将会成功。

相关内容