nginx 配置

把nginx.conf分为三个部分进行理解:

  •  

    第一部分:全局块
  •  

    第二部分:events块
  •  

    第三部分:http块

image

 在 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/,然后捕获剩余全部字符,直到结尾 $。

 

 

posted @ 2026-11-07 23:10  KLAPT  阅读(0)  评论(0)    收藏  举报