Nginx本地多项目配置异常排查:站点跳转HTTPS后无法访问
解决Nginx多站点配置的两个问题:localhost跳转与HTTPS重定向失败
首先,咱们拆解你遇到的两个核心问题,逐个给出解决方案:
1. 访问localhost自动跳转到site1.dev
这是Nginx的默认行为:当请求的域名没有匹配到任何server_name时,Nginx会把请求交给第一个加载的server块处理。你的两个server块都没有指定default_server标识,所以localhost请求就落到了第一个site1.dev的配置上。
解决方法选其一即可:
- 给指定站点设置默认server:在你想作为默认请求目标的server块的
listen指令后添加default_server。比如如果想让localhost单独处理,可以新建一个专属server块:
server { listen 80 default_server; listen [::]:80 default_server; server_name localhost; root /var/www/localhost/html; # 可替换为你给localhost准备的目录 index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } # PHP、.ht相关配置按需复制添加 }
- 调整server块加载顺序:把你不想作为默认的server块配置文件重命名为更靠前的名称(比如Nginx通常按文件名字母顺序加载
/etc/nginx/sites-enabled/下的配置),但这种方法不如设置default_server可靠。
2. 访问site1.dev跳转到HTTPS且无法访问
这个问题大概率是浏览器缓存了HTTPS重定向规则,或者存在隐性的重定向配置:
- 先排查浏览器缓存:用隐私/无痕窗口访问site1.dev,如果能正常打开,说明是浏览器记住了之前的HSTS(HTTP严格传输安全)头或301重定向缓存。此时你可以手动清除该域名的缓存,或者等待HSTS规则过期(通常为几天)。
- 检查Nginx配置中的重定向规则:仔细核对你的两个server块、Nginx主配置文件(如
nginx.conf)以及引用的配置片段(如snippets/下的文件),有没有类似return 301 https://$server_name$request_uri;的语句。如果有两种选择:- 暂时注释掉该语句,关闭HTTPS重定向;
- 补全HTTPS的server块配置(需先生成自签证书用于测试):
# 示例HTTPS server配置 server { listen 443 ssl; listen [::]:443 ssl; server_name site1.dev; ssl_certificate /path/to/your/cert.pem; # 替换为你的证书路径 ssl_certificate_key /path/to/your/key.pem; # 替换为你的密钥路径 root /var/www/site1.dev/html; index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.2-fpm.sock; } location ~ /\.ht { deny all; } }
- 确认hosts配置正确性:虽然ping能通,但再检查下
/etc/hosts文件,确保包含127.0.0.1 site1.dev site2.dev和::1 site1.dev site2.dev的条目,避免IPv6解析异常。
最后,修改完配置后务必执行sudo nginx -t检查语法,确认无误后重启Nginx:sudo systemctl restart nginx。
内容的提问来源于stack exchange,提问作者Braatan
相关产品推荐
相关产品推荐

