Nginx配置问题:强制HTTPS并移除WWW前缀后访问异常
解决Nginx强制HTTPS并移除WWW前缀的重定向问题
我之前也踩过Nginx重定向配置的坑,尤其是要同时实现强制HTTPS和移除WWW前缀的时候,很容易因为服务器块匹配逻辑、证书配置或者规则顺序出问题,导致浏览器报错。结合你的需求,我整理了一套可靠的配置方案,应该能解决你的问题:
核心配置思路
我们需要分三个服务器块覆盖所有请求场景:
- 捕获所有HTTP(80端口)请求,统一重定向到HTTPS的非WWW地址
- 捕获HTTPS(443端口)的WWW请求,重定向到非WWW的HTTPS地址
- 处理最终的HTTPS非WWW请求,提供正常站点内容
完整配置示例
# 1. 处理所有HTTP请求,强制跳转到HTTPS非WWW server { listen 80 default_server; listen [::]:80 default_server; server_name _; # 匹配所有主机名,包括带WWW和不带WWW的 return 301 https://domain.xyz$request_uri; } # 2. 处理HTTPS的WWW请求,跳转到非WWW的HTTPS server { listen 443 ssl; listen [::]:443 ssl; server_name www.domain.xyz; # 关键:这里必须确保SSL证书包含www.domain.xyz(通配符证书或SAN证书) ssl_certificate /path/to/your/fullchain.crt; ssl_certificate_key /path/to/your/private.key; return 301 https://domain.xyz$request_uri; } # 3. 主站点的HTTPS配置,处理非WWW的请求 server { listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name domain.xyz; ssl_certificate /path/to/your/fullchain.crt; ssl_certificate_key /path/to/your/private.key; # 这里替换成你的站点实际配置 root /var/www/domain.xyz/public; index index.html index.php; location / { try_files $uri $uri/ =404; # 如果是反向代理(比如Node.js/PHP),换成对应的proxy_pass等配置 # proxy_pass http://localhost:3000; } }
你可能遇到的Chrome报错原因排查
你提到访问www.domain.xyz时Chrome控制台出错,大概率是SSL证书不匹配导致的:
- 如果你的证书只覆盖了
domain.xyz,没有包含www.domain.xyz,当用户访问https://www.domain.xyz时,浏览器会因为证书域名不匹配抛出安全错误 - 解决办法:申请包含两个域名的SAN证书,或者使用通配符证书
*.domain.xyz
配置验证步骤
- 先检查Nginx配置语法是否正确:
sudo nginx -t - 如果语法没问题,重启Nginx生效:
sudo nginx -s reload - 用curl测试重定向是否正常:
正常情况下,这三个请求都应该返回# 测试HTTP带WWW curl -I http://www.domain.xyz/param # 测试HTTP不带WWW curl -I http://domain.xyz/param # 测试HTTPS带WWW curl -I https://www.domain.xyz/param301 Moved Permanently,并且Location头指向https://domain.xyz/param
内容的提问来源于stack exchange,提问作者peter Schiza
相关产品推荐
相关产品推荐

