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配置并兼容HTTP实现代码解析
Mar 31 Servers
使用goaccess分析nginx日志的详细方法
Jul 09 Servers
nginx中proxy_pass各种用法详解
Nov 07 Servers
深入解析Apache Hudi内核文件标记机制
Mar 31 Servers
Kubernetes控制节点的部署
Apr 01 Servers
idea下配置tomcat避坑详解
Apr 12 Servers
nginx容器方式反向代理实战
Apr 18 Servers
永中文档在线转换预览基于nginx配置部署方案
Jun 10 Servers
openEuler 搭建java开发环境的详细过程
Jun 10 Servers
Windows server 2012 NTP时间同步的实现
Jun 25 Servers
Windows Server 修改远程桌面端口的实现
Jun 25 Servers
kubernetes集群搭建Zabbix监控平台的详细过程
Jul 07 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批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
基于php中echo用逗号和用点号的区别详解
2018/01/23 PHP
JavaScript实现的购物车效果可以运用在好多地方
2014/05/09 Javascript
sails框架的学习指南
2014/12/22 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
angular多语言配置详解
2019/05/16 Javascript
vue源码nextTick使用及原理解析
2019/08/13 Javascript
微信小程序 如何保持登录状态
2019/08/16 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
Python实现多线程抓取网页功能实例详解
2017/06/08 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Python进程间通信Queue实例解析
2018/01/25 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
深入了解Django View(视图系统)
2019/07/23 Python
简单了解python数组的基本操作
2019/11/26 Python
python 如何对logging日志封装
2020/12/02 Python
2013的个人自我评价
2013/12/26 职场文书
党员干部民主生活会议批评与自我批评材料
2014/09/20 职场文书
汽车转让协议书
2015/01/29 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
分家协议书范本
2016/03/22 职场文书