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

Nginx不同子域名代理至对应后端服务的配置问题

解决Nginx域名转发错误的问题

嘿,我来帮你捋捋这个Nginx配置的问题!你现在遇到的所有域名都跳转到3000端口的情况,核心原因出在HTTP跳转规则的覆盖和缺少HTTPS版的dashboard服务器配置上,咱们一步步来修正:

问题分析

你的第一个server块监听80端口,把example.com、www.example.com和dashboard.example.com都包含进去了——只要访问这些域名的HTTP版本,都会被强制跳转到HTTPS。但你只配置了example.com的HTTPS server块,没有为dashboard.example.com配置对应的HTTPS规则,所以当dashboard.example.com跳转到HTTPS后,Nginx找不到匹配的server,就会默认使用第一个匹配到的HTTPS server(也就是指向3000端口的用户服务),自然所有请求都跑到用户端去了。另外,你第二个监听80的dashboard server块根本不会被触发,因为第一个server块已经精确匹配了dashboard.example.com的HTTP请求。

修正后的完整配置

把配置改成这样,就能实现你想要的效果:

# 处理用户域名的HTTP跳转,强制转到HTTPS
server {
    listen 80;
    listen [::]:80;
    
    server_name example.com www.example.com;
    return 302 https://$server_name$request_uri;
}

# 单独处理dashboard域名的HTTP跳转
server {
    listen 80;
    listen [::]:80;
    server_name dashboard.example.com;
    return 302 https://$server_name$request_uri;
}

# 普通用户服务的HTTPS配置
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate /etc/ssl/cert.pem;
    ssl_certificate_key /etc/ssl/key.pem;
    
    server_name example.com www.example.com;
    
    location / {
        proxy_pass http://localhost:3000;
        # 添加必要的代理头部,让Express应用获取正确的客户端信息
        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;
    }
}

# 管理员服务的HTTPS配置(关键!之前缺失的部分)
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate /etc/ssl/cert.pem;
    ssl_certificate_key /etc/ssl/key.pem;
    
    server_name dashboard.example.com;
    
    location / {
        proxy_pass http://localhost: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;
    }
}

关键改动说明

  • 拆分了原来的HTTP跳转server块,让用户域名和dashboard域名的HTTP请求分别处理,避免互相干扰。
  • 新增了dashboard.example.com的HTTPS server块,专门转发到3001端口,这样HTTPS请求就能正确匹配到管理员服务了。
  • 额外添加了几个常用的proxy_set_header配置,这能让你的Express应用获取到正确的客户端真实IP、请求协议等信息,很多业务逻辑都会依赖这些数据。

配置改完后,记得重启Nginx让配置生效:

sudo nginx -s reload

内容的提问来源于stack exchange,提问作者Vizious Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:37:45