root是追加路径,alias是替换路径:请求/static/css/main.css时,root /var/www找/var/www/static/css/main.css,alias /data/assets/则找/data/assets/css/main.css。

root 和 alias 的路径计算逻辑完全不同
很多人配完 root 或 alias 发现 404,根本原因是没理解它们怎么拼路径。不是写对了路径就行,而是得看 Nginx 怎么“算”出最终文件位置。
root 是追加:请求 /static/css/main.css,root /var/www → 实际找 /var/www/static/css/main.css。alias 是替换:同样请求 /static/css/main.css,alias /data/assets/ → 实际找 /data/assets/css/main.css(/static 这段被整个替掉了)。
-
location /static/后面带斜杠,alias值也必须以斜杠结尾,否则会拼错路径 -
root不要求 location 路径和目录名一致;但alias的 location 匹配部分必须完全被替换,否则缺失或多余路径段会导致 404 - 如果用
location /api配alias,Nginx 会把/api/user映射成/your/path/user;而用root就变成/your/path/api/user—— 差一个层级,极易踩坑
location 匹配优先级决定谁生效
写多个 location 块时,Nginx 不按配置顺序执行,而是按固定优先级选一个匹配项。搞错优先级,alias 可能根本没机会运行。
优先级从高到低:=(精确匹配) > ^~(前缀最长匹配) > 正则 ~ / ~* > 普通前缀匹配(/xxx)。
-
location = /health比location /health优先级高,前者只响应/health,后者还会匹配/healthz等 -
location ^~ /static/一旦匹配成功,就不再检查正则,适合静态资源兜底 - 如果同时写了
location /static和location ~* \.js$,访问/static/app.js会走前者(前缀匹配),不会进正则块——除非你把正则写成location ~* ^/static/.*\.js$
proxy_pass 路径处理容易漏掉尾部斜杠
反向代理时,proxy_pass 后是否带斜杠,直接决定 URL 路径怎么转发过去。这个细节不注意,后端服务收不到正确 path,返回 404 或 500。
比如前端请求 /api/v1/users:
-
proxy_pass http://backend;(无尾部斜杠)→ 后端收到/api/v1/users -
proxy_pass http://backend/;(有尾部斜杠)→ 后端收到/v1/users(/api被剥离) - 若
location /api/+proxy_pass http://backend/;,才真正实现路径前缀剥离;否则后端要自己处理/api前缀
rewrite 重定向时要注意 last 和 break 的行为差异
rewrite 不只是改 URL,它还控制后续 location 是否重新匹配。用错标志,可能导致循环重定向或路径映射失效。
-
rewrite ^/old/(.*) /new/$1 last;:重写后,Nginx 会用新 URI 再次查找location块(相当于内部跳转) -
rewrite ^/old/(.*) /new/$1 break;:重写后,直接在当前 location 内继续处理,不再匹配新路径 - 在
location /static/里用last,可能触发alias或root规则;用break则只影响当前块内的路径拼接逻辑 - 搭配
return 301或return 302更安全,避免 rewrite 循环(比如rewrite /a /b last;+rewrite /b /a last;)
最常被忽略的其实是斜杠语义:URI 末尾有没有 /,决定了 Nginx 是当文件还是目录处理;而 location、alias、proxy_pass 各自对斜杠的敏感点又不同。调不通时,先确认请求路径、location 块写法、目标路径三者斜杠数量和位置是否一致。











