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 header 字段,Tomcat 7 立即响应 400 Bad Request
,并且 POST 永远不会到达我的 servlet。有什么方法可以避免此错误响应并使用 servlet 处理 POST 以支持这些旧机器?
最佳答案
正如您已经注意到的,HTTP 1.1 spec says (大胆的矿山):
A client MUST include a Host header field in all HTTP/1.1 request messages. [...] An HTTP/1.1 proxy MUST ensure that any request message it forwards does contain an appropriate Host header field that identifies the service being requested by the proxy. All Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request) status code to any HTTP/1.1 request message which lacks a Host header field.
客户端错误地使用了 HTTP 1.1 协议(protocol),您不应该尝试在服务器端解决这个问题。您可以做的是设置一些自定义 HTTP 代理,它只会添加 Host
header 。但这是一个肮脏的解决方法。或者将协议(protocol)降级到 1.0。
另请注意,即使您以某种方式设法让 Tomcat 接受此类请求(这违反了规范),如果端点之间有任何 HTTP 代理,您仍然会遇到一些问题。
关于tomcat - Tomcat 可以接受没有主机 header 的 HTTP 1.1 请求吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12808451/