nginx匹配(xxx(sss(xxx并将其反向代理成 sss(xxx处理示例
需求:因为只有一个端口,但是有多个服务,所以需要以路径匹配服务的方式访问项目,但是项目使用了网关,所
以会在访问以及跳转路径上加上/pdc-web/导致接口地址/sss/**改变为/pdc-web/sss/**,导致接口访问404。此处的解决办
法使用nginx的正则表达式的方式来匹配动态接口(/pdc-web/不固定有可能是/pdc/,这个是运维人员命名的),使用
$1$2获取匹配接口的有效部分(/sss/**,既是用()括出来的部分),使用$query_string来传递参数。
1
server {
2 listen 10991 ;
3 server_name 192.168.100.202;
4 charset utf-8;
5 proxy_set_header X-RESQUEST-AGREEMENT http;
6 proxy_set_header X-HTTP-HOST $http_host;
7 proxy_set_header X-RESQUEST-URI $request_uri;
8 //网关的反向代理
9 location ~ ^/?.*(/sss/)(.*) {
10 if ( $query_string = '' ) {
11 proxy_pass http://192.168.30.79:8888$1$2;
12 }
13 proxy_pass http://192.168.30.79:8888$1$2?$query_string;
14 }
15
16 //以路径匹配服务 pdc
17 location /pdc-web/ {
18 alias html/pdc/;
19 index index.html index.htm;
20 }
21 location /dma/ {
22 proxy_pass http://192.168.30.79:8888/dma/;
23 }
24 //服务pdc的方向代理接口
25 location /pdc/ {
26 proxy_pass http://192.168.30.79:8888/pdc/;
27 }
28 //网关
29 location / {
30 root html/gateway/;
31 index index.html index.htm;
32 }
33 error_page 500 502 503 504 /50x.html;
34 location = /50x.html {
35 root html;
36 }
37 }
38
正则表达式解释:~ ^/?.*(/sss/)(.*)
1、~ 开启正则表达式
注意~与 ^ 之间由空格,正则表达式由 ^开始,
~ 区分大小写匹配
~* 不区分大小写匹配
!和!*分别为区分大小写不匹配及不区分大小写不匹配
^ 以什么开头的匹配
$ 以什么结尾的匹配
\ 转义字符。可以转. * ?等
* 代表任意字符
= 表示精确的查找地址,
2、^/?
^表示开始位置,/?表示有0或1个/
3、.*
.* 匹配任意次的非\n与\r之外的字符
匹配除“\n”和"\r"之外的任何单个字符。要匹配包括
. 点 “\n”和"\r"在内的任何字符,请使用像“[\s\S]”的模
式。
4、 (/sss/)
正则子表达式 匹配 /sss/;也是$1 取得值
5、(.*)
同3 ; $2 是指获取正则表达式匹配结果的第二个分组(也就是第二个括号中的内容)
6、$query_string
Nginx里面$query_string 与$args相同,存储了所提交的所有$query_string;比如&p=2887&q=test
如果想要在nginx里面单独访问这些变量。可以这样
比如$p变量可以这样访问 $arg_p