6

HTTP 1.1 规定:“客户端必须在所有 HTTP/1.1 请求消息中包含 Host 标头字段”

但是,我正在使用的机器发送这个精确的 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 以支持这些旧机器?

4

1 回答 1

6

正如您已经指出的,HTTP 1.1 规范说(我的粗体):

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

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

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

于 2012-10-09T21:16:47.533 回答