nginx 的 location 块负责请求匹配与路由,不直接重写 url;真正实现路径改写的是 rewrite 指令或 proxy_pass 的路径截断/拼接逻辑:结尾带 / 的 proxy_pass 会截掉匹配前缀,不带 / 则原样转发;需定制改写时用 rewrite 配合 break 等标志。

Nginx 的 location 块本身不直接“重写 URL”,而是通过配合 rewrite 指令或 proxy_pass 的路径处理机制,实现请求路径到后端应用的映射与转换。关键在于理解:location 负责匹配和路由,真正完成路径改写的是 rewrite 或 proxy_pass 的路径截断/拼接逻辑。
location 匹配后如何影响后端 URL
location 的作用是判断请求该进哪个处理分支,而它对后端 URL 的影响主要体现在 proxy_pass 的写法上:
-
proxy_pass http://backend/;(结尾有/)
→ 会截掉匹配的 location 路径前缀,再拼接到后端地址后。
例如:location /api/ { proxy_pass http://127.0.0.1:3000/; }请求
/api/users→ 后端收到/users -
proxy_pass http://backend;(结尾无/)
→ 不截断,原样转发整个 URI。
例如:location /api { proxy_pass http://127.0.0.1:3000; }请求
/api/users→ 后端收到/api/users
⚠️ 注意:
location /api和location /api/行为不同;前者会匹配/apiaaa,后者只匹配以/api/开头的路径,更安全。
需要显式重写时用 rewrite
当 proxy_pass 的路径拼接无法满足需求(比如需改写路径结构、剥离版本号、统一加前缀等),就在 location 内使用 rewrite:
location /v1/ {
rewrite ^/v1/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:3000;
}
→ 把 /v1/users 改写成 /users,再发给后端。
常用标志说明:
-
break:改写后停止当前 block 内后续 rewrite,直接执行proxy_pass -
last:改写后重新匹配 location(慎用,可能引发循环) -
redirect/permanent:返回 302 / 301 重定向(客户端跳转,非代理)
静态资源与动态请求分离时的典型写法
实际部署中常按用途分三类 location,其中两类隐含路径处理:
-
精准匹配首页
location = / { proxy_pass http://app:8000/; } -
静态文件(不走后端,Nginx 直接服务)
location ^~ /static/ { root /var/www/assets; expires 1h; } -
通用动态请求(兜底)
location / { proxy_pass http://app:8000/; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; }
这类配置下,所有非静态、非根路径的请求(如 /user/profile)都会被 location / 捕获,并以 /user/profile 形式转发给后端(因 proxy_pass 结尾带 /,已自动去除匹配前缀 /)。
不复杂但容易忽略











