Tomcat可以接受没有Host头的HTTP 1.1请求吗?

时间:2012-10-09 21:07:13

标签: tomcat bad-request http-1.1 hostheader

HTTP 1.1声明: “客户端必须在所有HTTP / 1.1请求消息中包含主机头字段”

然而,我正在处理的机器会发出这个确切的POST(包含坐标),我无权更改:

POST /touch HTTP/1.1
Content-type: application/x-www-form-urlencoded
Content-Length: <n>

x=<int x>&y=<int y>

由于缺少Host头字段,Tomcat 7立即响应400 Bad Request,POST永远不会到达我的servlet。有什么方法可以避免这个错误响应并使用servlet处理POST以支持这些旧机器吗?

1 个答案:

答案 0 :(得分:5)

正如您已经注意到的那样,HTTP 1.1 spec says(我的大胆):

  

客户端必须在所有HTTP / 1.1请求消息中包含Host header 字段。 [...] HTTP / 1.1代理必须确保它转发的任何请求消息都包含一个适当的主机头字段,用于标识代理请求的服务。所有基于Internet的HTTP / 1.1服务器必须以400 (错误请求)状态代码响应任何缺少主机头字段的HTTP / 1.1请求消息。

客户端错误地使用HTTP 1.1协议,您不应该尝试在服务器端解决此问题。您可以做的是设置一些自定义HTTP代理,只需添加Host标头。但这是一个肮脏的解决方法。或者将协议降级为1.0。

另请注意,即使您以某种方式设法让Tomcat接受此类请求(这违反了规范),如果任何HTTP代理在两端之间,您仍会遇到一些问题。