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 相关文章推荐
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
Jun 21 Servers
为什么 Nginx 比 Apache 更牛逼
Mar 31 Servers
nginx优化的六点方法
Mar 31 Servers
如何在centos上使用yum安装rabbitmq-server
Mar 31 Servers
解析在浏览器地址栏输入一个URL后发生了什么
Jun 21 Servers
关于nginx 实现jira反向代理的问题
Sep 25 Servers
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
Sep 25 Servers
Nginx 反向代理解决跨域问题多种情况分析
Jan 18 Servers
Kubernetes部署实例并配置Deployment、网络映射、副本集
Apr 01 Servers
忘记Grafana不要紧2种Grafana重置admin密码方法详细步骤
Apr 07 Servers
Windows server 2012 配置Telnet以及用法详解
Apr 28 Servers
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
Jul 15 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学习笔记 面向对象的构造与析构方法
2011/06/13 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
php使用ereg验证文件上传的方法
2014/12/16 PHP
PHP类型约束用法示例
2016/09/28 PHP
Smarty日期时间操作方法示例
2016/11/15 PHP
JavaScript中常用的运算符小结
2012/01/18 Javascript
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
JavaScript动态数量的文件上传控件
2016/11/18 Javascript
bootstrap实现的自适应页面简单应用示例
2017/03/09 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
python和C语言混合编程实例
2014/06/04 Python
Python网站验证码识别
2016/01/25 Python
Python生成随机数组的方法小结
2017/04/15 Python
详解 Python中LEGB和闭包及装饰器
2017/08/03 Python
selenium+python 对输入框的输入处理方法
2018/10/11 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
python elasticsearch环境搭建详解
2019/09/02 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
Python 执行矩阵与线性代数运算
2020/08/01 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
美国值得信赖的婚恋交友网站:eHarmony
2018/10/04 全球购物
怎样从/向数据文件读/写结构
2014/11/23 面试题
会计专业自荐信
2013/12/02 职场文书
挂科检讨书范文
2014/02/20 职场文书
会计专业自荐信
2014/06/03 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
研究生毕业登记表的自我鉴定范文
2019/07/15 职场文书