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
Linux安装Nginx步骤详解
Mar 31 Servers
nginx简单配置多个server的方法
Mar 31 Servers
Filebeat 采集 Nginx 日志的方法
Mar 31 Servers
win10安装配置nginx的过程
Mar 31 Servers
利用Nginx代理如何解决前端跨域问题详析
Apr 02 Servers
详解Apache SkyWalking 告警配置指南
Apr 22 Servers
详解nginx location指令
Jan 18 Servers
Kubernetes控制节点的部署
Apr 01 Servers
Tomcat starup.bat 脚本实现开机自启动
Apr 20 Servers
Nginx本地配置SSL访问的实例教程
May 30 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
论建造顺序的重要性
2020/03/04 星际争霸
在PHP中使用与Perl兼容的正则表达式
2006/11/26 PHP
收藏的一个php小偷的核心程序
2007/04/09 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
thinkphp使用literal防止模板标签被解析的方法
2014/11/22 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
新手入门常用代码集锦
2007/01/11 Javascript
javascript编程起步(第四课)
2007/02/27 Javascript
简单通用的JS滑动门代码
2008/12/19 Javascript
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
JQuery-tableDnD 拖拽的基本使用介绍
2013/07/04 Javascript
javascipt:filter过滤介绍及使用
2014/09/10 Javascript
利用jQuery实现WordPress中@的ID悬浮显示评论内容
2015/12/11 Javascript
JavaScript中获取纯正的undefined的方法
2016/03/06 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
node 解析图片二维码的内容代码实例
2019/09/11 Javascript
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python中使用SAX解析xml实例
2014/11/21 Python
Python lambda和Python def区别分析
2014/11/30 Python
Python的函数的一些高阶特性
2015/04/27 Python
django框架自定义用户表操作示例
2018/08/07 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
CSS Houdini实现动态波浪纹效果
2019/07/30 HTML / CSS
电子商务专业个人的自我评价
2013/11/19 职场文书
项目资料员岗位职责
2013/12/10 职场文书
教师产假请假条范文
2014/04/10 职场文书
分位数回归模型quantile regeression应用详解及示例教程
2021/11/02 Python
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server