nginx 配置
把nginx.conf分为三个部分进行理解:
-
第一部分:全局块 -
第二部分:events块 -
第三部分:http块

在 Nginx 中,要让请求跳转到其他服务接口的同样接口地址上的配置:
location / {
proxy_pass http://目标服务IP:端口$request_uri;
}
示例:假设目标服务是 http://172.168.1.1:3000
location / {
proxy_pass http://172.168.1.1:3000$request_uri;
}
-
客户端请求
http://你的域名/api/user?id=1 -
Nginx 会原样转发到
http://172.168.1.1:3000/api/user?id=1
只需要转发请求中的部分路径和参数,核心思路是用正则表达式捕获需要的片段,再通过 rewrite 或变量拼接出新的目标地址。参数部分需要特别留意:proxy_pass 默认会自动携带原始查询参数,如果只想传部分参数,要显式处理。
只取部分路径:用正则捕获组
用 location ~ 写正则,把需要的路径部分用括号 () 捕获,然后在 proxy_pass 或 rewrite 里用 $1、$2 引用。
例如,原始请求是 /api/v1/user/123,只想把 /user/123 转发到后端:
location ~ ^/api/v1/(.*)$ {
proxy_pass http://backend-service/$1;
}
这样 /api/v1/user/123 到达后端时,路径就变成了 /user/123
多个捕获组就按左括号出现的顺序从 $1 开始编号,依次递增。取第几个就用 $几。
基本规则
从左到右数左括号 ( 的位置,第一个 ( 对应 $1,第二个对应 $2,以此类推。嵌套时,外层括号先编号,内层后编号。
例子一:多个平级捕获组
location ~ ^/api/([^/]+)/user/(\d+)$ {
proxy_pass http://backend/$1/profile/$2;
}
-
第 1 个
(是([^/]+)→$1 -
第 2 个
(是(\d+)→$2
请求 /api/order/user/123:
-
$1=order -
$2=123 -
转发到
/order/profile/123
只取部分参数:用 $arg_参数名 或 set $args
Nginx 中 $args 是完整的查询串,$arg_xxx 是单个参数值。
方案一:只转发某一个参数
假设原始请求是 /search?q=nginx&page=2&token=abc,只把 q 和 page 传到后端,丢弃 token:
location /search {
# 重新构造查询串,只保留需要的参数
set $args "q=$arg_q&page=$arg_page";
proxy_pass http://backend-service;
}
这里 set $args 覆盖了原始查询串,proxy_pass 不带 URI 部分,后端就会收到重建后的参数。
方案二:在 rewrite 中丢弃原参数,只带新参数
如果路径也需要改写,可以配合 rewrite 的 ? 结尾来丢弃原查询串:
location ~ ^/old/(.*)$ {
# 结尾的 ? 表示丢弃原始查询参数
rewrite ^/old/(.*)$ /new/$1? break;
proxy_pass http://backend-service;
}
如果还想附加一个固定参数,可以在 ? 后面直接写:
rewrite ^/old/(.*)$ /new/$1?source=nginx break;
这样原始参数会被丢弃,只保留 source=nginx。
组合场景:既取部分路径,又取部分参数
例如,原始请求 /app/v2/orders?user=alice&debug=true,只把 /orders 和 user=alice 转发到后端:
location ~ ^/app/v2/(?<api_path>[^?]+) {
set $args "user=$arg_user";
proxy_pass http://backend-service/$api_path;
}
这里 $api_path 捕获了路径 /orders,$args 被重写为只包含 user=alice。
============================================特殊说明==============================
在 Nginx 的正则表达式里,(.*) 和 $ 都是正则表达式的语法,不是 Nginx 特有的固定写法。
(.*) 的含义
-
()是捕获组,把括号内匹配到的内容存起来,后面用$1、$2… 按顺序引用。 -
.匹配任意单个字符(默认不匹配换行)。 -
*表示前面的字符重复 0 次或多次。 -
合起来
(.*)就是"捕获从当前位置到结尾的所有字符",存到第一个捕获组$1里。
例如 ^/old/(.*)$ 匹配 /old/a/b/c 时,$1 就是 a/b/c。
$ 的含义
在正则表达式里,$ 是行尾锚点,表示"匹配到这里必须是字符串结尾"。它不是 Nginx 的固定写法,而是正则通用语法。
-
^是行首锚点,$是行尾锚点。 -
^/old/(.*)$的意思是:从开头^匹配/old/,然后捕获剩余全部字符,直到结尾$。

浙公网安备 33010602011771号