反向代理需统一proxy_pass尾部斜杠以避免路径重复;静态资源推荐alias而非root并注意斜杠;必须显式设置Host、X-Real-IP等请求头;try_files可实现静态资源回源,但需配合命名location且注意编码问题。

反向代理配置必须改掉 proxy_pass 末尾的斜杠
很多故障都源于 proxy_pass 后 URL 尾部斜杠不一致。比如后端服务监听在 http://127.0.0.1:8080/api/,若你在 Nginx 中写成 proxy_pass http://127.0.0.1:8080/api;(缺末尾斜杠),Nginx 会把请求路径原样拼接,导致后端收到 /api/user 变成 /api/api/user,返回 404。
正确做法是保持斜杠对齐:
- 后端路径带
/api/→proxy_pass http://127.0.0.1:8080/api/; - 后端根路径 →
proxy_pass http://127.0.0.1:8080/;
另外注意:如果用变量(如 $backend)拼接 proxy_pass,Nginx 会禁用 proxy_redirect 自动重写,需手动配 proxy_redirect。
动静分离要靠 location 前缀匹配 + root/alias 区分
静态资源(JS/CSS/图片)不该走后端,但很多人误用 root 和 alias 导致 403 或 404。关键区别在于路径拼接逻辑:
-
root /var/www/html;+location /static/→ 请求/static/js/app.js映射到/var/www/html/static/js/app.js -
alias /var/www/static/;+location /static/→ 请求/static/js/app.js映射到/var/www/static/js/app.js(/static/被完全替换)
常见错误:用 root 配置 location /static/ 却把文件放在 /var/www/static/,结果 Nginx 去找 /var/www/html/static/;或者用 alias 时漏掉结尾斜杠,变成 alias /var/www/static;,导致路径错位。
建议统一用 alias 处理明确前缀的静态目录,避免嵌套层级干扰。
proxy_set_header 必须显式传 Host 和 X-Real-IP
默认情况下,Nginx 发给后端的 Host 是 upstream 地址(如 127.0.0.1:8080),后端日志和鉴权常依赖原始域名,不设就会出问题。同理,X-Forwarded-For 在多层代理时可能被伪造,X-Real-IP 更可靠。
标准头设置应包含:
-
proxy_set_header Host $host;(不是$http_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 透传)
漏掉 Host 会导致 Spring Boot 的 server.forward-headers-strategy=framework 无法识别原始域名;漏掉 X-Real-IP 会让后端拿不到真实客户端 IP。
动静分离后,try_files 是防止静态资源回源的关键
即使配置了 location ~* \.(js|css|png|jpg)$,如果文件不存在,Nginx 默认会 404——但你可能希望它 fallback 到后端(比如某些构建产物路径动态生成)。这时候 try_files 就派上用场。
例如:
location / {
try_files $uri $uri/ @backend;
}
location @backend {
proxy_pass http://backend;
}这样请求 /app.js 会先查磁盘,命中则直接返回;未命中就交由 @backend 处理。注意:try_files 最后一个参数不能是纯 URI,必须是命名 location(以 @ 开头)或状态码,否则 Nginx 启动失败。
容易忽略的是:try_files 与 alias 共存时,$uri 是解码后的路径,而 alias 不处理编码,特殊字符(如空格、中文)可能导致匹配失败——生产环境建议静态资源文件名只用 ASCII 字符。


















