Nginx 如何在 Nginx 中使用 Rewrite 模块配合 proxy_pass 实现无感知路径隐藏

作者:袖梨 2026-09-01

要在 Nginx 中实现客户端访问 /api/xxx 时后端接收 /xxx,需利用 rewrite 与 proxy_pass 协同:方式一用 rewrite ^/api/(.*)$ /$1 break 配合 proxy_pass http://backend;方式二更推荐,直接写 proxy_pass http://backend/(末尾斜杠自动剥离前缀)。关键点包括必须加 break 防止循环匹配,proxy_pass 末尾斜杠不可省略,且应设置 proxy_set_header Host $host 避免后端拒绝请求。

要在 Nginx 中通过 rewrite 配合 proxy_pass 实现无感知的路径隐藏(即客户端访问 /api/xxx,后端实际接收的是 /xxx),关键在于控制 URI 重写时机和 proxy_pass 的路径拼接逻辑。

理解 rewrite 和 proxy_pass 的执行顺序

Nginx 中 rewrite 指令在 proxy_pass 之前执行,但是否生效取决于 proxy_pass 是否带路径尾部斜杠。若 proxy_pass 后跟完整 URI(含路径),Nginx 会忽略 location 匹配的原始 URI;若只指定上游地址(如 http://backend),则默认将匹配到的 URI 原样转发——这时才需要 rewrite 来修改 URI。

正确配置 rewrite + proxy_pass 的两种常用方式

以下两种写法都能实现“访问 /api/v1/user → 后端收到 /v1/user”的效果,选其一即可:

  1. 方式一:用 rewrite + proxy_pass 不带路径

    location /api/ {

    rewrite ^/api/(.*)$ /$1 break;

    proxy_pass http://backend;

    }

  2. 方式二:proxy_pass 直接带目标路径(更推荐)

    location /api/ {

    proxy_pass http://backend/;

    }

    注意:这里 proxy_pass 末尾的 / 很关键——它会让 Nginx 自动剥离 /api/ 前缀,再拼接剩余部分到 upstream 地址后。

避免常见陷阱

容易出错的地方包括:

  1. rewrite 后漏写 break:不加 break 会导致重写后再次进入 location 匹配循环,可能引发 500 或无限重定向;
  2. proxy_pass 写成 http://backend(无尾部斜杠):此时 Nginx 会把整个原始 URI(如 /api/v1/user)原样转发,rewrite 就白做了;
  3. location 使用正则表达式但未加 ^~~ 修饰符:可能导致优先级混乱,rewrite 不触发;
  4. 后端服务对 Host 头或 Referer 敏感:建议显式设置 proxy_set_header Host $host;,避免后端因 Host 不匹配拒绝请求。

验证是否生效的小技巧

可在后端服务日志中打印接收到的完整请求路径,或临时用 return 200 "URI: $request_urin"; 替代 proxy_pass 测试 rewrite 结果。例如:

location /api/ {

rewrite ^/api/(.*)$ /$1 break;

return 200 "Forwarded to: $uri";

}

访问 /api/test 应返回 Forwarded to: /test,说明 rewrite 已正确剥离前缀。

相关文章

精彩推荐