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进程锁的实现
Jun 14 Servers
nginx实现动静分离的方法示例
Nov 07 Servers
Nginx+Windows搭建域名访问环境的操作方法
Mar 17 Servers
Nginx图片服务器配置之后图片访问404的问题解决
Mar 21 Servers
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
Apr 07 Servers
CentOS7安装GlusterFS集群以及相关配置
Apr 12 Servers
nginx搭建NFS网络文件系统
Apr 14 Servers
Tomcat执行startup.bat出现闪退的原因及解决办法
Apr 20 Servers
搭建Yolov5服务器
Apr 30 Servers
基于docker安装zabbix的详细教程
Jun 05 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
用session做客户验证时的注意事项
2006/10/09 PHP
php启动时候提示PHP startup的解决方法
2013/05/07 PHP
ThinkPHP的常用配置选项汇总
2016/03/24 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
PHP生成随机字符串实例代码(字母+数字)
2019/09/11 PHP
PHP时间相关常用函数用法示例
2020/06/03 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
JavaScript随机排序(随即出牌)
2010/09/17 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
微信小程序模板(template)使用详解
2018/01/31 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
Vue实现的父组件向子组件传值功能示例
2019/01/19 Javascript
深入解读Node.js中的koa源码
2019/06/17 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
微信小程序自定义头部导航栏(组件化)
2019/11/15 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
python逐行读取文件内容的三种方法
2014/01/20 Python
Python中的descriptor描述器简明使用指南
2016/06/02 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
Html5无刷新修改browser Url的方法
2014/01/15 HTML / CSS
澳大利亚设计的婴儿和女孩的衣服:Oobi
2018/12/16 全球购物
外贸主管求职简历的自我评价
2013/10/23 职场文书
网吧收银员岗位职责
2013/12/14 职场文书
部队万能检讨书
2014/02/20 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
客户经理岗位职责
2015/01/31 职场文书
Python list列表删除元素的4种方法
2021/11/01 Python