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 比 Apache 更牛逼
Mar 31 Servers
Nginx+Tomcat实现负载均衡、动静分离的原理解析
Mar 31 Servers
Nginx代理同域名前后端分离项目的完整步骤
Mar 31 Servers
扩展多台相同的Web服务器
Apr 01 Servers
Linux中Nginx的防盗链和优化的实现代码
Jun 20 Servers
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
Jul 07 Servers
Nginx 路由转发和反向代理location配置实现
Nov 11 Servers
Nginx虚拟主机的配置步骤过程全解
Mar 31 Servers
从零开始在Centos7上部署SpringBoot项目
Apr 07 Servers
Consul在linux环境的集群部署
Apr 08 Servers
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
Apr 29 Servers
在容器中使用nginx搭建上传下载服务器
May 11 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 中文和编码判断代码
2010/05/16 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
php表单处理操作
2017/11/16 PHP
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
js实现异步循环实现代码
2016/02/16 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
通过命令行生成vue项目框架的方法
2017/07/12 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
python缩进区别分析
2014/02/15 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
python自动脚本的pyautogui入门学习
2020/04/01 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
中专生职业生涯规划书范文
2014/01/10 职场文书
《中华少年》教学反思
2014/02/15 职场文书
装修设计师求职信
2014/02/26 职场文书
银行进社区活动总结
2014/07/07 职场文书
主题党日活动总结
2014/07/08 职场文书
岗位竞聘报告范文
2014/11/06 职场文书