核心在于正确传递原始路径信息:proxy_pass带尾部斜杠可剥离location前缀,alias替代root精准映射静态目录,透传x-forwarded-port/x-forwarded-proto防止重定向错误,并显式声明各服务静态资源路径避免冲突。

核心在于让每层代理都正确传递原始请求路径信息,避免 Nginx 自动截断或拼接错误,同时后端应用能据此生成正确的资源 URL。
用 proxy_pass 带尾部斜杠 控制路径重写
这是最常出错的一环。当 location 匹配带前缀(如 /app)时:
- 写成
proxy_pass http://backend;(不带/)→ 请求路径原样保留,/app/api会转发为http://backend/app/api - 写成
proxy_pass http://backend/;(带/)→ Nginx 自动剥离 location 前缀,/app/api转发为http://backend/api
若后端服务本身不处理 /app 前缀(比如 Flask 或 Vue 项目静态资源默认在根路径),必须用后者,并确保前端构建时的 publicPath 与代理前缀一致(例如设为 /app/)。
用 alias 替代 root 处理静态资源目录
当 Nginx 直接提供静态文件(如 /static/、/images/),别用 root,改用 alias:
-
root /data;+location /static/ { ... }→ 实际找/data/static/下的文件 -
alias /data/static/;+location /static/ { ... }→ 实际找/data/static/下的文件(/static/被完全替换)
这样可避免因 location 路径被重复拼接导致 404。尤其适合多服务共用同一台 Nginx 但静态资源目录不同的场景。
透传原始端口与协议头防止重定向错误
多级代理(如 CDN → Nginx A → Nginx B → 应用)中,Location 响应头易被 Nginx 强制改为 http://host/ 或 https://host:80:
- 首层入口 Nginx 补全端口:
proxy_set_header X-Forwarded-Port $server_port; - 中间层继承不覆盖:
proxy_set_header X-Forwarded-Port $http_x_forwarded_port; - 禁用自动重写:
proxy_redirect off;(不要用default或留空) - 同时透传协议:
proxy_set_header X-Forwarded-Proto $scheme;
后端应用需读取这些 header 构造绝对 URL,否则跳转或资源链接会丢失端口或协议。
统一静态资源访问入口,避免 location 冲突
多个后端服务共用域名时(如 / 和 /admin),静态资源路径容易错乱:
- 浏览器请求
/admin/static/style.css,若没匹配到location /admin/static/,可能落入兜底location /,转发给主服务 - 解决方案:为每个服务显式声明静态资源路径,例如:
确保所有静态资源请求都被精准拦截,不依赖后端路由解析。











