Nginx配置验证通过但三级域名cspiero.domain.club无法正常路由的问题排查
我来帮你分析下这个问题,虽然nginx -t显示配置语法没问题,但实际路由异常通常是配置逻辑或者匹配优先级的问题,咱们一步步来排查:
先补全HTTPS Server块的监听配置
你第一个包含两个域名的Server块里,大概率没明确写listen 443 ssl;和listen [::]:443 ssl;吧?如果省略了这个配置,Nginx根本不会把HTTPS请求导向这个块,自然会落到默认配置里。补上这两行,确保HTTPS请求能匹配到目标Server块:server { listen 443 ssl; listen [::]:443 ssl; server_name production.domain.club cspiero.domain.club; root /home/deploy/domain/current/public; # 其他原有配置... ssl_certificate /etc/letsencrypt/live/cspiero.domain.club/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/cspiero.domain.club/privkey.pem; # managed by Certbot # 其他原有配置... }合并HTTP跳转配置,避免匹配漏洞
你现在分开写了两个80端口的Server块做HTTP转HTTPS,其实可以合并成一个,这样更简洁也不容易出匹配逻辑问题:server { listen 80; listen [::]:80; server_name production.domain.club cspiero.domain.club; return 301 https://$host$request_uri; }分开写的话,万一某个域名的
if判断优先级出问题,就会导致跳转失效,浏览器直接返回HTTP响应。检查SSL证书的覆盖范围
你当前用的证书是cspiero.domain.club单域名的,而Server块里同时包含production.domain.club,这理论上会导致production的HTTPS请求出现证书不匹配,但你说production正常,说明要么production有单独的证书配置,要么这个证书是通配符/多域名证书。如果是前者,建议给cspiero单独配置HTTPS Server块;如果是后者,用Certbot重新申请包含两个域名的证书更稳妥:sudo certbot certonly --nginx -d production.domain.club -d cspiero.domain.club申请完成后,Certbot会自动更新证书路径,或者你手动替换第一个Server块里的SSL证书路径即可。
确认默认Server的优先级
看看你的默认Nginx配置(比如/etc/nginx/sites-enabled/default)里,有没有listen 443 ssl default_server;这样的配置。如果有,当某个域名的HTTPS请求匹配不到对应的Server块时,就会落到这个默认Server里。你可以把第一个HTTPS Server块加上default_server参数,确保它优先处理匹配的域名:listen 443 ssl default_server; listen [::]:443 ssl default_server;别忘了重新加载配置
每次修改完配置,别只跑nginx -t,一定要执行sudo systemctl reload nginx,让新配置生效。nginx -t只是验证语法,不会把新配置加载到运行中的Nginx进程里。
备注:内容来源于stack exchange,提问作者Jerome

