You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx反向代理配置问题:多域名指向同一网站

Nginx反向代理多域名指向同一应用问题排查与解决建议

问题情况

配置Nginx反向代理时遇到异常:已为treseibert.com(对应后端Node.js应用端口3001)和wanderlog.treseibert.com(对应后端Node.js应用端口3000)分别定义独立server block,且配置了SSL/TLS终止,但访问任一域名均被重定向到3000端口的应用。

配置代码

# Redirect HTTP to HTTPS for treseibert.com and www.treseibert.com
server {
    listen 80;
    server_name treseibert.com www.treseibert.com;
    return 301 https://$host$request_uri;
}

# Redirect HTTP to HTTPS for wanderlog.treseibert.com and www.wanderlog.treseibert.com
server {
    listen 80;
    server_name wanderlog.treseibert.com www.wanderlog.treseibert.com;
    return 301 https://$host$request_uri;
}

# HTTPS server block for treseibert.com and www.treseibert.com
server {
    listen 443 ssl;
    server_name treseibert.com www.treseibert.com;
    ssl_certificate /etc/nginx/ssl/cert1.pem;
    ssl_certificate_key /etc/nginx/ssl/key1.key;

    location / {
        proxy_pass http://127.0.0.1:3001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # Additional SSL settings can be added here if needed
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

# HTTPS server block for wanderlog.treseibert.com and www.wanderlog.treseibert.com
server {
    listen 443 ssl;
    server_name wanderlog.treseibert.com www.wanderlog.treseibert.com;
    ssl_certificate /etc/nginx/ssl/cert1.pem;
    ssl_certificate_key /etc/nginx/ssl/key1.key;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # Additional SSL settings can be added here if needed
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

已执行的排查步骤

  • 检查Nginx配置文件(/etc/nginx/sites-available)的语法错误与正确性
  • 验证DNS设置,确保每个域名指向正确的服务器IP
  • 查看Nginx错误日志与访问日志,未发现相关线索
  • 检查防火墙规则,确保80和443端口的流量被允许
  • 排查网络配置,确认网络设置正确
  • 确保/etc/hosts文件中无冲突条目
  • 临时禁用Nginx的SSL配置,问题仍存在
  • 修改其中一个server block的端口进行测试,问题未改变

排查与解决建议

  • 确认配置是否正确加载:执行sudo nginx -t验证配置语法无误后,执行sudo nginx -s reload强制重载Nginx,避免旧配置未生效。
  • 检查默认Server块:排查主配置文件(/etc/nginx/nginx.conf)及所有include的配置文件,是否存在带有default_server标记的listen指令。如果有默认server块,可能会优先匹配未命中的请求,需确保目标域名的server块优先级更高,或调整默认server的逻辑。
  • 测试域名匹配逻辑:使用curl命令直接测试Nginx的路由,排除客户端缓存或DNS问题:
    curl -H "Host: treseibert.com" https://[你的服务器IP] -v
    curl -H "Host: wanderlog.treseibert.com" https://[你的服务器IP] -v
    
    观察返回的代理目标端口是否符合预期,确认Nginx是否正确匹配server块。
  • 检查后端应用重定向逻辑:排查Node.js应用代码,确认是否存在强制重定向到特定域名或端口的逻辑(比如Express的redirect设置、全局中间件等)。
  • 添加详细日志定位问题:修改Nginx日志格式,加入$server_name字段,明确每个请求匹配的server块:
    log_format detailed '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for" "$server_name"';
    access_log /var/log/nginx/access.log detailed;
    
    重载Nginx后访问两个域名,查看日志中$server_name字段是否与请求域名匹配。
  • 清除客户端缓存:301重定向会被浏览器永久缓存,测试时使用隐私窗口或清除浏览器缓存,避免旧的错误重定向影响测试结果。

内容的提问来源于stack exchange,提问作者Tre Seibert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:14:51