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使用Lua模块实现WAF的原理解析
Sep 04 Servers
Nginx配置根据url参数重定向
Apr 11 Servers
Tomcat starup.bat 脚本实现开机自启动
Apr 20 Servers
Tomcat项目启动失败的原因和解决办法
Apr 20 Servers
Ubuntu Server 安装Tomcat并配置systemctl
Apr 28 Servers
Nginx配置之禁止指定IP访问
May 02 Servers
排查Tomcat进程假死的问题
May 06 Servers
Nginx开源可视化配置工具NginxConfig使用教程
Jun 21 Servers
云服务器部署 Web 项目的实现步骤
Jun 28 Servers
Windows Server 2012 R2服务器安装与配置的完整步骤
Jul 15 Servers
Nginx跨域问题解析与解决
Aug 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
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
js事件(Event)知识整理
2012/10/11 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
js和jquery中循环的退出和继续下一个循环
2014/09/03 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
2016/12/20 Javascript
微信小程序button组件使用详解
2018/01/31 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
2018/02/10 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
ES6 中可以提升幸福度的小功能
2018/08/06 Javascript
深入理解JavaScript的值传递和引用传递
2018/10/24 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
[01:08:09]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第二局
2016/03/02 DOTA
跟老齐学Python之做一个小游戏
2014/09/28 Python
Python深入06——python的内存管理详解
2016/12/07 Python
Python线程创建和终止实例代码
2018/01/20 Python
python3调用R的示例代码
2018/02/23 Python
简单了解django缓存方式及配置
2019/07/19 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
司机的工作范围及职责
2013/11/13 职场文书
工业学校毕业生自荐书
2014/01/03 职场文书
初中体育教学反思
2014/01/14 职场文书
平安建设实施方案
2014/03/19 职场文书
促销活动总结报告
2014/04/26 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
活动总结格式
2014/08/30 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
婚宴主持词
2015/06/30 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript
Mysql调整优化之四种分区方式以及组合分区
2022/04/13 MySQL