如何让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
相关产品推荐
相关产品推荐

