nginx location中多个if里面proxy_pass的方法


Posted in Servers onMarch 31, 2021

1、首先我们回顾一下nginx中location的相关知识

1)location的匹配指令:

  • ~      #波浪线表示执行一个正则匹配,区分大小写
  • ~*    #表示执行一个正则匹配,不区分大小写
  • ^~    #^~表示普通字符匹配,不是正则匹配。如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
  • =      #进行普通字符精确匹配
  • @     #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

2)location 匹配的优先级(与location在配置文件中的顺序无关)

1.= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
2.普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
3.^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
4.最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。

2、nginx多个if里面proxy_pass:

server {
listen 127.0.0.1:80;
    set $test A; 
  
    set $testB B;
    location / {
      if ($test ~* "A") { 
         proxy_pass http://www.so.com; 
         break; 
      } 
      if ($testB ~* "B") { 
         proxy_pass http://www.sogou.com; 
         #break; 
      } 
    }
}

希望满足某个条件的时候,走某个proxy_pass。但是如果多个if都满足,比如上例中的情况:在第一个if中没有break的时候,就会执行下面的;为了第一个匹配上之后就执行proxy_pass,可以加上break。(在nginx中貌似没有if else这样的指令)

3、判断参数进行不同的proxy_pass:

rewrite只能通过url路径进行匹配,不能进行参数匹配,所以如果要实现参数的判断需要用$arg_parameter。

location / {
    root  html;
    index  index.html index.htm index.php;
    proxy_redirect   off;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header  Connection "";

    if ( $query_string ~* "usg=0" ) {
      proxy_pass   http://local_workera;
    }

    if ( $query_string ~* "usg=1" ) {
      proxy_pass   http://local_workerb;
    }

    if ( $arg_uid ~* "(.*[AB]$)" ) {
  proxy_pass   http://local_workerf;
    }

    proxy_pass  http://local_workera;
}

1)请求路径中的usg=0和usg=1这两个参数是确定的,所以使用了$query_string进行正则匹配即可;($query_string的值是请求中所有参数)

2)接下来,我们想对uid的值如果是以A、B结尾的请求,转向local_workerf处理,这时候就无法用$query_string进行正则匹配了;(因为对于/?uid=1A&t=1&usg=1和/?uid=123&t=A&usg=0 不太好匹配)这时,只能用$arg_uid进行正则匹配了。

3)由于usg=0和usg=2这两个参数是互斥的,所以根据上面location中if指令的逻辑,不用break也可以正确处理,且放到最上面。对于uid的匹配,由于会和usg进行冲突,所以只能放到最下面或者加break,即:

location / {
    root  html;
    index  index.html index.htm index.php;
    proxy_redirect   off;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header  Connection "";
 
 if ( $arg_uid ~* "(.*[AB]$)" ) {
  proxy_pass   http://local_workerf;
  break;
    }

    if ( $query_string ~* "usg=0" ) {
      proxy_pass   http://local_workera;
    }

    if ( $query_string ~* "usg=1" ) {
      proxy_pass   http://local_workerb;
    }

    proxy_pass  http://local_workera;
}

到此这篇关于nginx location中多个if里面proxy_pass的方法的文章就介绍到这了,更多相关nginx location proxy_pass内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
nginx处理http请求实现过程解析
Mar 31 Servers
Nginx域名转发https访问的实现
Mar 31 Servers
Nginx已编译的nginx-添加新模块
Apr 01 Servers
利用Nginx代理如何解决前端跨域问题详析
Apr 02 Servers
Z-Order加速Hudi大规模数据集方案分析
Mar 31 Servers
nginx location 带斜杠【 / 】与不带的区别
Apr 13 Servers
微信告警的zabbix监控系统 监控整个NGINX集群
Apr 18 Servers
Windows Server 2012配置DNS服务器的方法
Apr 29 Servers
openEuler 搭建java开发环境的详细过程
Jun 10 Servers
Windows server 2003卸载和安装IIS的图文教程
Jul 15 Servers
彻底卸载VMware虚拟机的超详细步骤记录
Jul 15 Servers
Docker容器harbor私有仓库部署和管理
Aug 05 Servers
nginx配置proxy_pass中url末尾带/与不带/的区别详解
Mar 31 #Servers
Linux安装Nginx步骤详解
Nginx 502 Bad Gateway错误原因及解决方案
Nginx访问日志及错误日志参数说明
Mar 31 #Servers
nginx对http请求处理的各个阶段详析
Mar 31 #Servers
Nginx服务器添加Systemd自定义服务过程解析
Mar 31 #Servers
nginx处理http请求实现过程解析
Mar 31 #Servers
You might like
Banner程序
2006/10/09 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
2012/12/10 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
YII框架http缓存操作示例
2019/04/29 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
2015/10/27 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
Python THREADING模块中的JOIN()方法深入理解
2015/02/18 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
win10系统下Anaconda3安装配置方法图文教程
2018/09/19 Python
python得到电脑的开机时间方法
2018/10/15 Python
Python3离线安装Requests模块问题
2019/10/13 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
2020/09/17 Python
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
最新远光软件笔试题面试题内容
2013/11/08 面试题
劳资专员岗位职责
2013/12/27 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
语文教师个人工作总结
2015/02/06 职场文书
年底个人总结范文
2015/03/10 职场文书
2019各种保证书范文
2019/06/24 职场文书
导游词之寿县报恩寺
2020/01/19 职场文书
SQL Server实现分页方法介绍
2022/03/16 SQL Server
SQL Server内存机制浅探
2022/04/06 SQL Server
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript