考虑一个服务于三个虚拟主机的Web服务器:
现在假设服务器收到以下原始请求消息(代码格式化删除了终止\r\n序列):
GET / HTTP/1.1
Host: nothostedhere.com
Run Code Online (Sandbox Code Playgroud)
关于如何响应当前服务器上不存在的主机名请求,我没有在RFC 2616中看到任何指导(也许我错过了?).例如,Apache只会将其配置中定义的第一个虚拟主机用作"主要主机",并假装客户端请求该主机.显然,这比返回400 Bad Request响应更有效,并保证客户端总能看到一些表示.
所以我的问题是......
400如果客户端在使用HTTP/1.1协议时请求不存在的主机,那么除了"健壮性与正确性"参数之外,任何人都可以提供理由来阻止我对(或其他错误代码)做出响应吗?
请注意,所有HTTP/1.1请求必须Host:根据RFC 2616 指定标头.对于HTTP/1.0请求,唯一真正的选项是提供"主"主机结果.此问题专门针对HTTP/1.1协议请求.
在这种情况下,400并不是真正的语义正确的响应代码.
由于语法格式错误,服务器无法理解请求.
这不是发生的事情.请求在语法上是有效的,并且你的时间服务器已达到路由阶段(当您检查头的值),这已经被确定.
我会说这里正确的响应代码是403:
服务器理解请求,但拒绝履行请求.
这更准确地描述了发生的事情.服务器拒绝履行请求,因为它无法执行,并且可以在消息实体中提供更详细的错误消息.
还有一个论点是404可以接受/正确,因为无法找到满足请求的合适文档,但我个人认为这不是正确的选项,因为404声明:
服务器未找到与Request-URI匹配的任何内容
这明确提到了Request-URI的一个问题,并且在路由阶段的这个早期阶段,您可能对URI不感兴趣,因为您首先需要将请求分配给主机,然后才能确定它是否具有合适的文档处理URI路径.
在HTTP/1.1 Host:标头中是必需的.如果客户端声明它使用的是1.1版并且没有提供Host:标头,那么400肯定是正确的响应代码.如果客户端声明它使用的是1.0版本,则不需要提供主机头,这应该得到优雅处理 - 这种情况与无法识别的域相同.
实际上,您在此事件中有两个选项:将请求路由到默认虚拟主机容器,或者响应错误.如上所述,如果您要回复错误,我相信错误应该是403.
| 归档时间: |
|
| 查看次数: |
3228 次 |
| 最近记录: |