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 相关文章推荐
Filebeat 采集 Nginx 日志的方法
Mar 31 Servers
Mac环境Nginx配置和访问本地静态资源的实现
Mar 31 Servers
学习nginx基础知识
Sep 04 Servers
Nginx中使用Lua脚本与图片的缩略图处理的实现
Mar 18 Servers
nginx搭建NFS网络文件系统
Apr 14 Servers
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
Apr 29 Servers
nginx 配置缓存
May 11 Servers
win server2012 r2服务器共享文件夹如何设置
Jun 21 Servers
nginx代理实现静态资源访问的示例代码
Jul 07 Servers
阿里云服务器(windows)手动部署FTP站点详细教程
Aug 05 Servers
win10搭建配置ftp服务器的方法
Aug 05 Servers
修改Nginx配置返回指定content-type的方法
Sep 23 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
php 更新数据库中断的解决方法
2009/06/05 PHP
ExtJS与PHP、MySQL实现存储的方法
2010/04/02 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
PHP中获取时间的下一周下个月的方法
2014/03/18 PHP
护卫神php套件 php版本升级方法(php5.5.24)
2015/05/10 PHP
php去掉文件前几行的方法
2015/07/29 PHP
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
2020/03/23 PHP
javascript语句中的CDATA标签的意义
2007/05/09 Javascript
javascript学习笔记(十一) 正则表达式介绍
2012/06/20 Javascript
Jquery index()方法 获取相应元素索引值
2012/10/12 Javascript
javascript中解析四则运算表达式的算法和示例
2014/08/11 Javascript
JS实现控制文本框的内容
2016/07/10 Javascript
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
分享vue.js devtools遇到一系列问题
2017/10/24 Javascript
Vue父子模版传值及组件传值的三种方法
2017/11/27 Javascript
jQuery封装animate.css的实例
2018/01/04 jQuery
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
python读取几个G的csv文件方法
2019/01/07 Python
Python实现动态给类和对象添加属性和方法操作示例
2020/02/29 Python
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
巴西婴儿用品商店:Bebe Store
2017/11/23 全球购物
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
什么是命名空间(NameSpace)
2015/11/24 面试题
办公室前台岗位职责
2014/01/04 职场文书
铁路个人事迹材料
2014/01/30 职场文书
汇报材料怎么写
2014/12/30 职场文书
项目负责人岗位职责
2015/02/15 职场文书
小学班级口号大全
2015/12/25 职场文书
教师教育心得体会
2016/01/19 职场文书
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python