关键在于location与proxy_pass斜杠协同:末尾均带斜杠可剥离前缀(如/location /static/ { proxy_pass http://cdn/; }/),否则易透传导致404;正则匹配需显式指定URI,避免双斜杠或路径错位。

关键在明确 location 匹配路径和 proxy_pass 目标路径之间的替换关系。斜杠不是风格问题,而是行为开关——它决定 Nginx 是“去掉前缀再转发”,还是“原样拼过去”。静态资源 404 往往就卡在这一步没对齐。
静态资源路径要和后端服务部署上下文严格一致
比如前端请求 /static/logo.png,而你的静态服务(如 Nginx 或 CDN)实际只响应根路径下的文件(即访问 /logo.png 就能拿到),那就必须让 proxy_pass 剥离掉 /static/ 这个前缀。
- 正确写法(剥离前缀):
location /static/ { proxy_pass http://cdn/; }
请求 /static/logo.png → 后端收到 /logo.png - 错误写法(透传全路径):
location /static/ { proxy_pass http://cdn; }
请求 /static/logo.png → 后端收到 /static/logo.png,若 cdn 没配 /static/ 上下文,直接 404
正则匹配时必须显式写出目标 URI,不能省略斜杠
用 ~ 或 ~* 写静态资源规则时,Nginx 不再自动推导路径截取逻辑,proxy_pass 必须带完整目标路径,且末尾斜杠是语义必需的。
- 错误:不带 URI,Nginx 启动失败
location ~ \.(js|css|png|jpg|gif)$ { proxy_pass http://assets; } - 正确:显式重写并补上斜杠,确保路径干净
location ~ ^/static/(.+)$ { proxy_pass http://assets/$1; }
或更稳妥地统一归到根:location ~ \.(js|css|png|jpg|gif)$ { proxy_pass http://assets/; }
避免双斜杠干扰,location 和 proxy_pass 斜杠需协同
location 末尾有斜杠(如 /static/),proxy_pass 末尾也带斜杠(http://upstream/),这是最清晰、最不容易出错的组合。否则可能触发双斜杠(如 //logo.png),部分后端会拒绝或重定向,导致 404 或 301 循环。
- 推荐统一风格:
location /static/ { proxy_pass http://cdn/; } - 避免混搭:
location /static { proxy_pass http://cdn/; }(location 无尾斜杠 + proxy_pass 有尾斜杠 → 可能生成 /static/logo.png → /static/logo.png,未剥离) - 也不建议:
location /static/ { proxy_pass http://cdn; }(易透传前缀,引发 404)
用 curl 和 access_log 快速验证路径是否被正确改写
别只看浏览器报错,直接查 Nginx 日志或用 curl 模拟,确认后端实际收到的路径。
- 加日志格式记录上游地址与 URI:
log_format upstream '$remote_addr - $upstream_addr "$request" $status $upstream_http_content_type'; - 测试命令:
curl -v http://your-nginx/static/test.png
观察响应头中的 X-Upstream-Addr 或直接看 access.log 中的 $upstream_addr 和转发路径 - 重点关注日志里后端接收的 URI 是否符合预期,而不是你“以为”的路径











