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作grpc的反向代理踩坑总结
Jul 07 Servers
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
Feb 12 Servers
Apache Linkis 中间件架构及快速安装步骤
Mar 16 Servers
Dashboard管理Kubernetes集群与API访问配置
Apr 01 Servers
Ubuntu Server 安装Tomcat并配置systemctl
Apr 28 Servers
Nginx HTTP跳转至HTTPS
May 15 Servers
阿里云服务器Ubuntu 20.04上安装Odoo 15
May 20 Servers
nginx设置资源请求目录的方式详解
May 30 Servers
阿里云服务器部署RabbitMQ集群的详细教程
Jun 01 Servers
windows server 2012安装FTP并配置被动模式指定开放端口
Jun 10 Servers
openEuler 搭建java开发环境的详细过程
Jun 10 Servers
nginx配置指令之server_name的具体使用
Aug 14 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
《APMServ 5.1.2》使用图解
2006/10/23 PHP
php生成过去100年下拉列表的方法
2015/07/20 PHP
php基于环形链表解决约瑟夫环问题示例
2017/11/07 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
JavaScript 模拟用户单击事件
2009/12/31 Javascript
JavaScript中使用构造器创建对象无需new的情况说明
2012/03/01 Javascript
浅析Javascript中“==”与“===”的区别
2014/12/23 Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
2015/12/31 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
JS中的三个循环小结
2017/06/20 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
vue使用axios实现文件上传进度的实时更新详解
2017/12/20 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
Vue多组件仓库开发与发布详解
2019/02/28 Javascript
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
win7 下搭建sublime的python开发环境的配置方法
2014/06/18 Python
python多进程操作实例
2014/11/21 Python
举例详解Python中的split()函数的使用方法
2015/04/07 Python
解析Python中的__getitem__专有方法
2016/06/27 Python
Python队列的定义与使用方法示例
2017/06/24 Python
python实现五子棋小游戏
2020/03/25 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
餐厅销售主管职责范本
2014/02/19 职场文书
职务任命书范本
2014/06/05 职场文书
理发店策划方案
2014/06/05 职场文书
学习十八大宣传标语
2014/10/09 职场文书
群众路线表态发言材料
2014/10/17 职场文书
小学生法制教育心得体会
2016/01/14 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js