Nginx重定向链问题:排查Map实现单次HTTP转HTTPS无WWW跳转的错误
Nginx重定向链问题排查与修复
你的配置没生效,大概率是这两个核心问题:
1. Map块放错位置了
Nginx的map指令必须放在http全局上下文(所有server块外面),要是你把它写到某个server块里面,这个映射完全不会生效,$nonwwwhost变量拿不到正确值,跳转逻辑还是会用原来的$host,自然会出现先跳www再跳主域名的链。
2. HTTP监听的Server块没覆盖全域名
如果你的HTTP server块只配了server_name www.example.com,example.com的请求会落到默认server块,要是默认块的规则是跳去www,那就算map配置对了,也会先触发www跳转,再走HTTPS的非www重定向。
正确配置示例
把map放在http全局块,同时覆盖HTTP和HTTPS的所有域名:
http { # 全局配置(比如日志、SSL参数等)... # 定义非www域名映射(必须在server块外) map $host $nonwwwhost { ~*^www\.(.*)$ $1; # 匹配www开头的域名,提取出主域名 default $host; # 非www域名直接返回原host } # 你的原有$real_scheme映射配置 map $scheme $real_scheme { default $scheme; } # HTTP 80端口监听:统一跳转到HTTPS非www域名 server { listen 80; server_name example.com www.example.com; if ($real_scheme = 'http') { return 301 https://$nonwwwhost$request_uri; } } # HTTPS 443端口:处理www域名的残留跳转 server { listen 443 ssl; server_name www.example.com; return 301 https://example.com$request_uri; } # HTTPS主域名业务配置 server { listen 443 ssl; server_name example.com; # 你的业务配置(根目录、反向代理等) root /usr/share/nginx/html; index index.html; # SSL证书配置 ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; } }
额外注意事项
- 改完配置先跑
nginx -t检查语法,别直接重启导致服务挂了。 - 测试前清浏览器缓存,301重定向会被浏览器缓存,旧缓存会干扰测试结果。
- 确认
$real_scheme的映射逻辑没问题,能准确识别HTTP请求。
内容的提问来源于stack exchange,提问作者Dushyanth Manicks
相关产品推荐
相关产品推荐

