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配置ssl实现https的方法示例
Mar 31 Servers
Nginx tp3.2.3 404问题解决方案
Mar 31 Servers
浅谈Nginx 中的两种限流方式
Mar 31 Servers
详解Nginx启动失败的几种错误处理
Apr 01 Servers
Nginx配置Https安全认证的实现
May 26 Servers
Nginx配置之实现多台服务器负载均衡
Aug 02 Servers
苹果M1芯片安装nginx 并且部署vue项目步骤详解
Nov 20 Servers
Z-Order加速Hudi大规模数据集方案分析
Mar 31 Servers
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
May 11 Servers
Nginx利用Logrotate实现日志分割
May 20 Servers
nginx 配置指令之location使用详解
May 25 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使用mkdir创建多级目录入门例子
2014/05/10 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
Yii2框架数据库简单的增删改查语法小结
2016/08/31 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
ext for eclipse插件安装方法
2008/04/27 Javascript
基于JQuery的类似新浪微博展示信息效果的代码
2012/07/23 Javascript
没有document.getElementByName方法
2013/08/19 Javascript
js获取select选中的option的text示例代码
2013/12/19 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
百度地图api如何使用
2015/08/03 Javascript
JavaScript中对DOM节点的访问、创建、修改、删除
2015/11/16 Javascript
小巧强大的jquery layer弹窗弹层插件
2015/12/06 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
详解JQuery基础动画操作
2019/04/12 jQuery
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
Python生成随机MAC地址
2015/03/10 Python
python实现自动更换ip的方法
2015/05/05 Python
python Web开发你要理解的WSGI & uwsgi详解
2018/08/01 Python
解决HTML5手机端页面缩放的问题
2017/10/27 HTML / CSS
Asics日本官网:鬼冢八喜郎创立的跑鞋运动品牌
2017/10/18 全球购物
美国正宗设计师眼镜在线零售商:EYEZZ
2019/03/23 全球购物
《鞋匠的儿子》教学反思
2014/03/02 职场文书
市场开发计划书
2014/05/07 职场文书
乡镇挂职心得体会
2014/09/04 职场文书
出纳试用期自我评价
2015/03/10 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
防卫过当辩护词
2015/05/21 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书
装修安全责任协议书
2016/03/22 职场文书
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python
python工具dtreeviz决策树可视化和模型可解释性
2022/03/03 Python
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js