Nginx重定向配置问题:将各类域名跳转至HTTPS非WWW域名
正确配置Nginx实现强制HTTPS+非www跳转
我明白你遇到的问题了——之前对$host变量的理解确实有误,这也是很多刚接触Nginx的开发者容易踩的坑。先给你纠正一下:$host其实对应请求中的Host头字段(如果客户端发送了的话),或者是当前server块中server_name匹配到的第一个域名,所以当你访问www.api.test.example.com时,$host的值就是完整的www.api.test.example.com,并不会自动去掉前面的www.部分。
下面给你一套通用的配置方案,可以实现:
- 所有HTTP请求(不管带不带www)强制跳转到HTTPS的非www版本
- 所有HTTPS的www请求(包括多级子域名的www前缀,比如
www.api.test.example.com)跳转到对应的非www HTTPS版本
完整配置示例
1. 处理所有HTTP请求(80端口)
这个server块会捕获所有80端口的请求,统一重定向到HTTPS的非www版本:
server { listen 80; listen [::]:80; server_name _; # 匹配所有HTTP请求,无需指定具体域名 # 去掉Host中的www.前缀(如果有的话) set $target_host $host; if ($host ~* ^www\.(.*)) { set $target_host $1; } # 永久重定向到HTTPS的非www地址 return 301 https://$target_host$request_uri; }
2. 处理HTTPS的www请求(443端口)
这个server块专门匹配所有带www.前缀的HTTPS请求,跳转到对应的非www版本:
server { listen 443 ssl http2; listen [::]:443 ssl http2; # 正则匹配所有以www.开头的域名 server_name ~^www\.(.*)$; # 配置你的SSL证书,注意证书要覆盖对应的www域名(比如泛域名证书) ssl_certificate /path/to/your/certificate.pem; ssl_certificate_key /path/to/your/private-key.key; # 可选:添加SSL优化配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 提取去掉www.后的目标域名 set $target_host $1; # 永久重定向到非www的HTTPS地址 return 301 https://$target_host$request_uri; }
3. 处理非www的HTTPS业务请求(443端口)
这是你的核心业务server块,处理最终的非www HTTPS请求:
server { listen 443 ssl http2; listen [::]:443 ssl http2; # 配置你的非www域名,可以是单个域名或多个(用空格分隔) server_name example.com api.test.example.com; # 根据实际情况修改 ssl_certificate /path/to/your/certificate.pem; ssl_certificate_key /path/to/your/private-key.key; # 可选:SSL优化配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 这里添加你的业务逻辑配置,比如反向代理、静态文件服务等 location / { # 示例:反向代理到后端服务 # proxy_pass http://your-backend-service; # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; # 示例:静态文件服务 # root /var/www/your-site; # index index.html; } }
关键注意事项
- SSL证书覆盖:确保你的证书包含所有需要跳转的域名。比如如果要处理
www.example.com和example.com,证书需要同时包含这两个域名;如果是多级子域名,推荐使用泛域名证书(比如*.test.example.com)或者SAN证书。 - 配置测试:修改完配置后,先执行
nginx -t检查语法是否正确,确认无误后再用nginx -s reload重新加载配置。 - 重定向类型:示例中用的是
return 301(永久重定向),适合生产环境;如果是测试阶段,可以先用return 302(临时重定向),确认跳转逻辑正确后再改成301。
内容的提问来源于stack exchange,提问作者MrCroft
相关产品推荐
相关产品推荐

