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



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头字段,Tomcat7立即用400 Bad Request进行响应,POST永远不会到达我的servlet。有没有什么方法可以避免这种错误响应,并使用servlet处理POST以支持这些旧机器?

正如您已经注意到的,HTTP1.1规范中说(我的):

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

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

还要注意的是,即使您设法让Tomcat接受这样的请求(这违反了规范),如果任何HTTP代理处于两端,您仍然会遇到一些问题。

最新更新