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