`HTTP/1.1` 响应返回 HTTP 状态代码 `421 Misdirected Request` 是不是有意义?

Posted

技术标签:

【中文标题】`HTTP/1.1` 响应返回 HTTP 状态代码 `421 Misdirected Request` 是不是有意义?【英文标题】:Does it make any sense for a `HTTP/1.1` response to return HTTP status code `421 Misdirected Request`?`HTTP/1.1` 响应返回 HTTP 状态代码 `421 Misdirected Request` 是否有意义? 【发布时间】:2019-05-03 03:09:11 【问题描述】:

我目前正在调试来自 API 的令人惊讶的“错误请求”响应。

请求:

POST /path HTTP/1.1
...

回复:

HTTP/1.1 421 Misdirected Request
Date: Fri, 30 Nov 2018 21:59:12 GMT
...
Via: https/1.1 subdomain.example.org (ApacheTrafficServer/7.1.4)
...

根据我的研究,HTTP 状态代码 421 仅与 http/2 specification 一起添加。如您所见,我的客户端正在发送 HTTP1.1 请求。

在响应 HTTPS/1.1 请求时使用它是否有意义?这意味着什么?


更新:进一步研究表明,这个 421 响应是由 header 中的无效 CSRF 令牌和 Cookie 值触发的,使用可验证的有效组合重试请求会返回预期结果为 200 OK。不幸的是,这并不能真正解释任何事情。

【问题讨论】:

【参考方案1】:

为 HTTP/2 添加了 421,允许连接重用。如果客户端错误地重用了连接 (like Firefox used to),那么服务器应该对此做出响应。

但这并不意味着它只是一个 HTTP/2 状态码。例如,如果负载均衡器接收 HTTP/2 请求并通过 HTTP/1.1 将它们传递给后端服务器,那么如果其中一个后端服务器认为它错误地发送了该请求,则可以拒绝通过 HTTP/1.1 的请求。如您所见,您的请求是通过 Apache Traffic Server 发送的,所以我怀疑这就是这里发生的情况。

【讨论】:

谢谢,好点子。虽然:客户端绝对不会重用任何连接并发送 HTTP/1.1 请求。 Apache Traffic Server 使用 HTTP/2 并在内部选择了错误的服务器是否有意义? 我认为最常见的 HTTP 1.1 用例(如果它确实有效)是用于虚拟主机环境中的未知 Host 标头值。 可能可以用于此,但在这种情况下,大多数服务器只是默认为第一个 vhost,并且不确定他们是否有兴趣更改此设置(至少默认情况下)。

以上是关于`HTTP/1.1` 响应返回 HTTP 状态代码 `421 Misdirected Request` 是不是有意义?的主要内容,如果未能解决你的问题,请参考以下文章

Springboot 构建http服务,返回的http行是'HTTP/1.1 200' 无状态码描述 客户端解析错误

运维安全-HTTP协议

三HTTP响应

HTTP/1.1 响应多个范围

HTTP 行首阻塞:为啥响应必须按顺序返回

Http协议