425 Too Early
用法
425 Too Early 错误与建立 HTTPS 连接所需的时间有关。当存在显著延迟时,TLS 建立安全连接所需的时间会变得很长。一种优化方式是让客户端在流程早期、安全连接尚未完全建立之前就发送数据。
如果链路中涉及某个中间方,该中间方必须包含 Early-Data: 1 请求头。中间方不得移除此头。这会告知服务器该请求是在早期数据中发送的,并且客户端理解 425 Too Early 响应。
请求
GET /tech-news HTTP/1.1
Host: example.com
Early-Data: 1
请求的原始发起方无需发送此头。通过提前发送数据,客户端即表明理解其后果,并会妥善处理 425 Too Early 响应。
在某些情况下发送早期数据并不可取,服务器会返回此错误作为响应。其风险在于客户端请求可能被重放,从而导致危害安全的副作用。
当客户端收到此状态码时,请求会被自动重试——在握手完成、安全连接建立之后。
SEO 影响
像 Google 这样的搜索引擎不会索引返回 425 状态的 URL。过去已被索引但返回此状态码的 URL 会从搜索结果中移除。
示例
客户端请求某个资源,服务器返回 425 Too Early,指示客户端等到连接完全建立后再重试。
请求
GET /tech-news HTTP/1.1
Host: example.com
Content-Type: application/xml
Content-Length: 225
<Message includes early data>
响应
HTTP/1.1 425 Too Early
如何修复
在 TLS 握手完全完成后重试请求。客户端应等待安全连接建立完毕再重新发送。大多数浏览器和 HTTP 库会自动处理此重试。
避免在 TLS 0-RTT 早期数据中发送非幂等请求(如 POST、PUT 或 DELETE)。只有幂等的 GET 请求适合放入早期数据,因为重放它们不会产生副作用。
在服务器端的 nginx 中,ssl_early_data 指令控制 0-RTT 行为。设置 ssl_early_data off; 可拒绝所有早期数据,从而完全消除此响应。当启用 0-RTT 时,通过 proxy_set_header Early-Data $ssl_early_data; 将早期数据信号传递给后端,让应用逐请求决定接受还是拒绝早期数据。
收到 Early-Data: 1 头的后端应用应拒绝带有副作用的请求(账户变更、支付、表单提交),返回 425。安全的只读端点则正常处理。
从客户端转发早期数据的中间方必须保留 Early-Data: 1 头。移除该头会使源站服务器无法检测到重放风险。
代码参考
.NET
HttpStatusCode.TooEarly
Rust
http::StatusCode::TOO_EARLY
Rails
:too_early
Go
http.StatusTooEarly
Symfony
Response::HTTP_TOO_EARLY
Python3.9+
http.HTTPStatus.TOO_EARLY
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_TOO_EARLY
Angular
@angular/common/http/HttpStatusCode.TooEarly