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

如何让Nginx根据原始请求动态执行proxy_pass代理?

解决Nginx根据请求域名动态proxy_pass的问题

问题根源

你之前的配置无效,核心原因是在使用变量形式的proxy_pass时,错误拼接了$request_uri。当proxy_pass使用静态域名时,Nginx会自动处理请求URI的替换;但用变量时,Nginx会直接把完整的请求路径拼接到目标域名后,导致路径重复(比如原请求/api/xxx会变成https://www.stage.env/api/xxx/api/xxx),后端无法识别。

正确配置方案

方案1:直接使用变量作为proxy_pass目标(推荐)

只传递域名部分,让Nginx自动处理请求URI:

# 处理API请求,动态代理到对应环境域名
location /api/ {
    proxy_pass $scheme://$host;
    # 必须配置的代理头部,确保后端能正确识别请求来源
    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;
}

# 静态资源服务配置
location / {
    root /path/to/your/static/files; # 替换为你的静态文件实际目录
    index index.html index.htm;
    try_files $uri $uri/ /index.html; # 单页应用可选配置,解决路由跳转问题
}

方案2:配合rewrite处理URI(适用于需要调整路径的场景)

如果需要去掉API请求的前缀(比如/api),可以用rewrite配合:

location /api/ {
    rewrite ^/api/(.*)$ /$1 break; # 剥离/api前缀后再转发
    proxy_pass $scheme://$host;
    # 同上的代理头部配置
    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;
}

# 静态资源配置同方案1
location / {
    root /path/to/your/static/files;
    index index.html index.htm;
}

额外注意事项

  • 确保Nginx容器能正确解析www.stage.env和www.prod.env:可以在Docker容器的/etc/hosts中添加域名与后端IP的映射,或者配置容器使用能解析这些内部域名的DNS服务器。
  • 测试时可通过curl -H "Host: www.stage.env" http://nginx容器IP/api/test验证代理是否生效。

内容的提问来源于stack exchange,提问作者4xy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:27:19