【问题标题】:Can Tomcat accept HTTP 1.1 requests without a Host header?Tomcat 可以接受没有 Host 标头的 HTTP 1.1 请求吗?
【发布时间】:2012-10-09 21:07:12
【问题描述】:

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 以支持这些旧机器?

【问题讨论】:

    标签: tomcat bad-request http-1.1 hostheader


    【解决方案1】:

    正如你已经指出的,HTTP 1.1 spec says(我的粗体字):

    客户端必须在所有 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 代理,您仍然会遇到一些问题。

    【讨论】:

    • 这是一个工作中的测试工具,所以中间代理不是问题。我宁愿在tomcat中做一些工作,比如过滤器或阀门,而不是设置代理,但我认为阀门不能在请求被拒绝之前拦截它。
    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2014-09-28
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    相关资源
    最近更新 更多