Nginx是否支持HTTP 103 Early Hint?反向代理遇兼容问题
Early Hints在Nginx反向代理Puma场景下的问题解析
这是个很典型的HTTP/2 Early Hints(103状态码)在反向代理场景下的兼容性问题,我来帮你拆解清楚核心原因和解决方案:
核心结论:Nginx对Early Hints的支持有明确版本限制
首先直接给结论:Nginx从1.15.3版本开始正式支持HTTP/2 Early Hints,如果你的Nginx版本低于这个号,它无法正确处理Puma返回的103响应——这就是Chrome和Safari报错的关键原因:这两个浏览器对HTTP/2协议的规范执行更严格,遇到不符合规范的响应就会抛出ERR_SPDY_PROTOCOL_ERROR(SPDY是HTTP/2的前身,Chrome用这个错误码标识HTTP/2协议异常);而Firefox对这类协议不兼容情况的容忍度更高,所以能正常加载页面。
即使版本达标,还要注意这些配置细节
如果你的Nginx版本已经≥1.15.3,那得检查反向代理的配置是否正确传递103响应:
- 确保Nginx与Puma之间的代理连接使用HTTP/1.1或更高版本(103是HTTP/1.1引入的状态码),可以在
location块中添加:proxy_http_version 1.1; - 开启请求头部传递,保证Puma返回的
Link等Early Hints相关头部能正确到达客户端:proxy_pass_request_headers on; - 若使用HTTPS(大概率是),必须在
listen指令中开启http2参数,因为Early Hints在HTTP/2下的支持才是标准行为:listen 443 ssl http2;
后续排查建议
- 先确认你的Nginx版本,执行命令:
如果版本低于1.15.3,升级到稳定版(比如1.24.x系列的最新版本)是最直接的解决方案。nginx -v - 对照上面的配置要点检查你的
nginx.conf,补全缺失的配置项。 - 用nghttp客户端测试时,重点观察是否能完整接收到103响应和后续的200响应,同时对比Chrome DevTools的Network面板,确认请求使用的是HTTP/2协议。
内容的提问来源于stack exchange,提问作者Rohan Pujari
相关产品推荐
相关产品推荐

