如何通过 proxy_ssl_server_name 解决回源多证书场景下的 SNI 域名匹配难题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计734个文字,预计阅读时间需要3分钟。
纯开启 `proxy_ssl_server_name + on,不能解决 SNI 匹配问题,真正起作用的是它与 `proxy_ssl_name` 的配合——前者启用 SNI 的功能,后者决定发什么值。
必须同时启用并动态设置 SNI 值
Nginx 默认用 proxy_pass 后写的地址(如 https://10.0.0.100)作为 SNI 字段内容。这在后端只服务一个域名时可行,但遇到多证书场景(比如一个 IP 对应 shop-a.com、shop-b.net 两个独立站点),就会固定错配。
- 添加
proxy_ssl_server_name on;到location块中(不支持写在upstream内) - 紧接着配置
proxy_ssl_name $host;,让 SNI 值随客户端请求的 Host 头实时变化 - 避免写死字符串,例如
proxy_ssl_name "api.example.com";,除非所有请求都指向同一域名
应对 CDN 回源时 Host 被覆盖的情况
Cloudflare、阿里云全站加速等 CDN 回源时通常会重写 Host 头为源站配置名,导致 $host 变成 CDN 设定的源站域名,而非用户原始请求域名(如用户访问的是 shop-a.com,但 Nginx 收到的 Host 是 origin.example.com)。
本文共计734个文字,预计阅读时间需要3分钟。
纯开启 `proxy_ssl_server_name + on,不能解决 SNI 匹配问题,真正起作用的是它与 `proxy_ssl_name` 的配合——前者启用 SNI 的功能,后者决定发什么值。
必须同时启用并动态设置 SNI 值
Nginx 默认用 proxy_pass 后写的地址(如 https://10.0.0.100)作为 SNI 字段内容。这在后端只服务一个域名时可行,但遇到多证书场景(比如一个 IP 对应 shop-a.com、shop-b.net 两个独立站点),就会固定错配。
- 添加
proxy_ssl_server_name on;到location块中(不支持写在upstream内) - 紧接着配置
proxy_ssl_name $host;,让 SNI 值随客户端请求的 Host 头实时变化 - 避免写死字符串,例如
proxy_ssl_name "api.example.com";,除非所有请求都指向同一域名
应对 CDN 回源时 Host 被覆盖的情况
Cloudflare、阿里云全站加速等 CDN 回源时通常会重写 Host 头为源站配置名,导致 $host 变成 CDN 设定的源站域名,而非用户原始请求域名(如用户访问的是 shop-a.com,但 Nginx 收到的 Host 是 origin.example.com)。

