HTTPQUERY
English

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