Nginx代理POST请求至EAS托管Expo Web的SNI重定向问题求助
解决Nginx代理EAS Hosting(SNI TLS)的握手与解析问题
核心问题分析
你遇到的两难本质是:
- 无
resolver时,Nginx启动阶段无法解析example.app域名,导致代理失败 - 添加
resolver后,虽然能解析到IP,但SSL握手时SNI主机名或上游请求的Host头不匹配,触发EAS的SNI服务器返回握手失败
修正后的Nginx配置
http { .... server { # Docker环境默认DNS用127.0.0.11,其他环境可替换为8.8.8.8等公共DNS resolver 127.0.0.11 ipv6=off valid=30s; location /xyz/ { proxy_intercept_errors on; error_page 502 = @handle_redirect; } location @handle_redirect { # 传递正确的Host头给EAS服务器,匹配SNI路由要求 proxy_set_header Host example.app; # 显式指定SSL握手时的SNI主机名,与目标域名一致 proxy_ssl_name example.app; # 启用Nginx的SNI支持 proxy_ssl_server_name on; # 若无需验证上游证书可保留,生产环境建议启用验证并配置可信证书 proxy_ssl_verify off; proxy_pass https://example.app; # 可选:传递客户端真实IP和协议信息 proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } } }
关键配置说明
resolver ... valid=30s:配置动态域名解析,valid参数设置解析结果缓存时间,减少重复DNS请求proxy_set_header Host example.app:确保EAS服务器收到的请求包含正确主机名,这是SNI路由和证书匹配的核心前提proxy_ssl_name example.app:强制指定SSL握手阶段发送的SNI标识,避免Nginx用解析后的IP作为SNI值(这会导致EAS无法匹配对应证书)proxy_ssl_server_name on:开启SNI支持,让Nginx在SSL握手时携带指定的主机名信息
额外提示
如果你的需求是将所有POST请求直接转发到Expo客户端(而非仅处理502错误),可调整location配置如下:
location /xyz/ { if ($request_method = POST) { proxy_set_header Host example.app; proxy_ssl_name example.app; proxy_ssl_server_name on; proxy_ssl_verify off; proxy_pass https://example.app; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; break; } # 非POST请求的原有处理逻辑 }
内容的提问来源于stack exchange,提问作者amelongo
相关产品推荐
相关产品推荐

