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动态转换图片大小生成缩略图
Mar 31 Servers
nginx网站服务如何配置防盗链(推荐)
Mar 31 Servers
教你快速开启Apache SkyWalking的自监控
Apr 25 Servers
Nginx图片服务器配置之后图片访问404的问题解决
Mar 21 Servers
Linux中如何安装并部署Redis
Apr 18 Servers
排查Tomcat进程假死的问题
May 06 Servers
nginx之queue的具体使用
Jun 28 Servers
使用 DataAnt 监控 Apache APISIX的原理解析
Jul 07 Servers
nginx代理实现静态资源访问的示例代码
Jul 07 Servers
Windows Server 2012 R2服务器安装与配置的完整步骤
Jul 15 Servers
Nginx如何配置多个服务域名解析共用80端口详解
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准确计算复活节日期的方法
2015/04/18 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
php中关于换行的实例写法
2019/09/26 PHP
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
解决bootstrap中modal遇到Esc键无法关闭页面
2015/03/09 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
2016/10/19 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
2017/12/22 Javascript
Vue头像处理方案小结
2018/07/26 Javascript
[00:03]DOTA2新版本PA至宝展示
2014/11/19 DOTA
使用Python装饰器在Django框架下去除冗余代码的教程
2015/04/16 Python
python安装与使用redis的方法
2016/04/19 Python
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
Django中间件实现拦截器的方法
2018/06/01 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
2019/04/02 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
Django contrib auth authenticate函数源码解析
2020/11/12 Python
python爬虫请求头的使用
2020/12/01 Python
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
货车司机岗位职责
2014/03/18 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
协议书的格式
2014/04/23 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
不同意离婚上诉状
2015/05/23 职场文书