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配置ssl实现https的方法示例
Mar 31 Servers
阿里云Nginx配置https实现域名访问项目(图文教程)
Mar 31 Servers
nginx配置文件使用环境变量的操作方法
Jun 02 Servers
Nginx location 和 proxy_pass路径配置问题小结
Sep 04 Servers
Apache POI的基本使用详解
Nov 07 Servers
使用 Apache 反向代理的设置技巧
Jan 18 Servers
Shell脚本一键安装Nginx服务自定义Nginx版本
Mar 20 Servers
深入解析Apache Hudi内核文件标记机制
Mar 31 Servers
Minikube搭建Kubernetes集群
Mar 31 Servers
Windows和Linux上部署Golang并运行程序
Apr 22 Servers
windows server 2012安装FTP并配置被动模式指定开放端口
Jun 10 Servers
腾讯云服务器部署前后分离项目之前端部署
Jun 28 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设计模式 Mediator (中介者模式)
2011/06/26 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
2018/04/20 PHP
php实现微信支付之退款功能
2018/05/30 PHP
PHP基于openssl实现的非对称加密操作示例
2019/01/11 PHP
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
浅析javascript函数表达式
2016/02/10 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
2021/01/19 Vue.js
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
[03:09]显微镜下的DOTA2第一期——带你走进华丽的DOTA2世界
2014/06/20 DOTA
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
2017/11/16 Python
Pycharm更换python解释器的方法
2018/10/29 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
Python3如何对urllib和urllib2进行重构
2019/11/25 Python
keras之权重初始化方式
2020/05/21 Python
python实现取余操作的简单实例
2020/08/16 Python
python批量修改文件名的示例
2020/09/27 Python
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
电信营业员自我评价分享
2014/01/17 职场文书
小学六年级学生评语
2014/04/22 职场文书
三分钟演讲稿范文
2014/04/24 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
“三支一扶”支教教师思想汇报
2014/09/13 职场文书
先进班集体事迹材料
2014/12/25 职场文书
公司承诺函范文
2015/01/21 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
2015年秋季运动会广播稿
2015/08/19 职场文书
励志正能量20句:送给所有为梦想拼搏的人
2019/11/11 职场文书
Django项目如何正确配置日志(logging)
2021/04/29 Python
Python-OpenCV实现图像缺陷检测的实例
2021/06/11 Python
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript
搭建Yolov5服务器
2022/04/30 Servers