在这种情况下,400 并不是真正语义正确的响应代码。
10.4.1 400 错误请求
由于语法错误,服务器无法理解该请求。
这不是已经发生的事情。该请求在语法上是有效的,并且当您的服务器到达路由阶段(当您检查标头的值时)时,这已经确定了。
我会说这里正确的响应代码是 403:
10.4.4 403 禁止
服务器理解请求,但拒绝执行。
这更准确地描述了发生的事情。服务器拒绝完成请求,因为它无法完成,并且可以在消息实体中提供更详细的错误消息。
还有一个论点是 404 是可以接受/正确的,因为找不到满足请求的合适文档,但我个人认为这不是正确的选择,因为 404 指出:
10.4.5 404 未找到
服务器没有找到任何与 Request-URI 匹配的东西
这明确提到了 Request-URI 的问题,并且在路由阶段的早期阶段,您可能对 URI 不感兴趣,因为您首先需要将请求分配给主机,然后才能确定它是否具有合适的文档处理 URI 路径。
In HTTP/1.1 Host:
headers are mandatory. If a client states that it is using version 1.1 and does not supply a Host:
header then 400 is definitely the correct response code. If the client states that it is using version 1.0 then it is not required to supply a host header and this should be handled gracefully - and this scenario amounts to the same situation as an unrecognised domain.
Really you have two options in this event: route the request to a default virtual host container, or respond with an error. As outlined above, if you are going to respond with an error, I believe the error should be 403.