nginx中proxy_pass实现路径裁剪的核心是location与proxy_pass末尾斜杠的组合:带/时自动剥离location前缀再拼接,不带/时原样转发完整uri;正则匹配需用$1等变量显式截取,且proxy_pass不能以/结尾。

在 Nginx 中用 proxy_pass 实现微服务网关的统一路径裁剪代理,核心在于理解 Nginx 如何处理 location 匹配后的 URI 重写逻辑。关键不是靠 rewrite,而是靠 location 的匹配方式与 proxy_pass 末尾斜杠的组合来自动裁剪路径前缀。
用带尾部斜杠的 proxy_pass 自动裁剪前缀
这是最简洁、推荐的方式。当 location 使用精确或前缀匹配,且 proxy_pass 的 URL 以 / 结尾时,Nginx 会自动把匹配到的 location 路径前缀从请求 URI 中移除,再拼接到后端地址之后。
例如,把所有 /user/ 开头的请求代理到用户服务,并去掉 /user 前缀:
location /user/ {
proxy_pass http://127.0.0.1:8081/;
}说明:
- 请求
GET /user/profile?id=1→ 后端收到GET /profile?id=1 - 请求
POST /user/login→ 后端收到POST /login - 注意:
location和proxy_pass都必须带尾部/,缺一不可 - 如果
proxy_pass不写尾斜杠(如http://127.0.0.1:8081),Nginx 会原样转发完整 URI,不裁剪
用正则 location + proxy_pass 实现灵活裁剪
当需要更复杂的路径映射(比如多级前缀映射、版本号透传、或统一入口下多个子服务),可用带捕获的正则 location,配合 proxy_pass 中的变量引用。
示例:将 /v1/auth/xxx 代理到认证服务,裁掉 /v1/auth,但保留后续路径:
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
location ~ ^/v1/auth/(.*)$ {
proxy_pass http://127.0.0.1:8082/$1;
}说明:
-
$1表示正则第一个捕获组,即/(.*)匹配到的路径部分 - 请求
/v1/auth/token/refresh→ 后端收到/token/refresh - 注意:正则 location 中
proxy_pass不能以/结尾,否则变量会被忽略 - 若需透传查询参数,无需额外配置,Nginx 默认保留
避免常见陷阱
路径裁剪失效往往源于几个典型误操作:
-
location 末尾没加 /,proxy_pass 却加了 /:如
location /user { proxy_pass http://s1/; }→ 匹配/user但不匹配/user/,且裁剪行为异常 -
proxy_pass 写成域名但没配 resolver:若用域名(如
proxy_pass http://user-svc:8081/;)且未配置resolver,Nginx 启动时无法解析,会报错或 fallback 到 127.0.0.1 -
忽略大小写或编码问题:Nginx 默认区分大小写;URI 中的
%2F不会被自动解码,若后端依赖原始编码,需用proxy_redirect off;和underscores_in_headers on;等辅助配置 -
未设置必要的代理头:微服务常依赖
X-Real-IP、X-Forwarded-For、X-Forwarded-Proto,应在location块中显式添加:
proxy_set_header Host $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;
结合 upstream 实现服务发现与负载均衡
生产环境建议把后端服务抽象为 upstream,便于管理、健康检查和横向扩展:
upstream user_backend {
server 10.0.1.10:8081 max_fails=3 fail_timeout=30s;
server 10.0.1.11:8081 max_fails=3 fail_timeout=30s;
keepalive 32;
}
<p>server {
listen 80;
location /user/ {
proxy_pass <a href="https://www.php.cn/link/1350d8094f9a38c781e25ff74a1a6e2f">https://www.php.cn/link/1350d8094f9a38c781e25ff74a1a6e2f</a>;
proxy_http_version 1.1;
proxy_set_header Connection '';</p><h1>其他 proxy_* 配置...</h1><pre class="brush:php;toolbar:false;"><code>}</code>}
说明:
-
keepalive启用连接池,显著降低后端建连开销 -
proxy_http_version 1.1+Connection ''是复用 HTTP/1.1 连接的关键组合 - 可进一步加入
health_check(需 Nginx Plus)或用第三方模块(如 nginx_upstream_check_module)做主动健康探测










