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动态转换图片大小生成缩略图
Mar 31 Servers
nginx location中多个if里面proxy_pass的方法
Mar 31 Servers
Nginx解决403 forbidden的完整步骤
Apr 01 Servers
Nginx已编译的nginx-添加新模块
Apr 01 Servers
Nginx配置文件详解以及优化建议指南
Sep 15 Servers
Nginx内网单机反向代理的实现
Nov 07 Servers
Apache POI的基本使用详解
Nov 07 Servers
Nginx下SSL证书安装部署步骤介绍
Dec 06 Servers
Windows server 2012搭建FTP服务器
Apr 29 Servers
Nginx本地配置SSL访问的实例教程
May 30 Servers
linux目录管理方法介绍
Jun 01 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将两个关联数组合并函数提高函数效率
2014/03/18 PHP
php发送邮件的问题详解
2015/06/22 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
2015/12/18 Javascript
解决JS无法调用Controller问题的方法
2015/12/31 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
深入理解javascript中的 “this”
2017/01/17 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
2017/07/13 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
vue组件间的参数传递实例详解
2019/04/26 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
JavaScript对象属性操作实例解析
2020/02/04 Javascript
python中wx将图标显示在右下角的脚本代码
2013/03/08 Python
python打开网页和暂停实例
2014/09/30 Python
Python浅拷贝与深拷贝用法实例
2015/05/09 Python
浅谈python数据类型及类型转换
2017/12/18 Python
python实现批量图片格式转换
2020/06/16 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
2019/08/27 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
Room Mate Hotels美国:西班牙酒店品牌
2018/04/10 全球购物
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
复核员上岗演讲稿
2014/01/05 职场文书
母亲追悼会答谢词
2014/01/27 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书