HTTPQUERY
English

421 Misdirected Request

用法

421 Misdirected Request 错误表示服务器无法生成响应。该状态是连接复用的结果,即服务器不希望客户端复用连接。作为回应,客户端会尝试通过另一条连接重新提交请求。

当选中某个替代服务(Alt-Svc)时也会出现这种情况。

该状态不会由代理生成。

SEO 影响

Google 建议返回 421 以拒绝 Googlebot 通过 HTTP/2 抓取。Googlebot 会同时通过 HTTP/1.1 和 HTTP/2 抓取。对来自 Googlebot 的 HTTP/2 请求返回 421,会停止对该站点的 HTTP/2 抓取。返回 421 的页面不会被索引,之前已被索引但返回此状态码的 URL 会从搜索结果中移除。

示例

客户端请求某个资源,服务器返回 421 Misdirected Request,因为请求到达了一条并非为该主机准备的连接。

请求

GET /tech-news HTTP/2
Host: example.com

响应

HTTP/2 421 Misdirected Request

如何修复

在一条新建的、专用于目标源站的连接上重试请求。浏览器或客户端应新建一个 TCP/TLS 会话,而不是复用已有的 HTTP/2 多路复用连接。

在服务器端,确认 TLS 证书覆盖了该服务器处理的每一个主机名。SNI(Server Name Indication)值与 Host 头不匹配是最常见的触发原因。

当 nginx 通过 HTTPS 反向代理到 Apache 后端时,启用 SNI 转发,使 Apache 能看到正确的主机名:

在 Apache 中,确认每个虚拟主机都有匹配的 ServerName 和有效的证书。近期 Apache 版本收紧了 SNI 校验,会拒绝 SNI 主机名与 Host 头冲突的请求。

对于将流量重新加密回源站的 CDN 和负载均衡器,确保上游 TLS 握手发送了正确的 SNI 值。Cloudflare 及类似服务需要源站证书列出所有被服务的主机名。

当多个域名共享一个 IP 但使用不同证书时,在服务器上禁用 HTTP/2 连接合并(connection coalescing)。每个域名需要独立的连接。

代码参考

.NET

HttpStatusCode.MisdirectedRequest

Rust

http::StatusCode::MISDIRECTED_REQUEST

Rails

:misdirected_request

Go

http.StatusMisdirectedRequest

Symfony

Response::HTTP_MISDIRECTED_REQUEST

Python3.5+

http.HTTPStatus.MISDIRECTED_REQUEST

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_MISDIRECTED_REQUEST

Angular

@angular/common/http/HttpStatusCode.MisdirectedRequest