当前位置: 首页 > news >正文

nginx location if 的匹配规则

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

nginx location if 的匹配规则

wKiom1cHwqKBXD7NAAArlOqkfC0923_middle.jpg
cuizhiliang关注0人评论 23197人阅读 2016-11-20 16:13:32
 

cation匹配命令

~      #波浪线表示执行一个正则匹配,区分大小写
~*    #表示执行一个正则匹配,不区分大小写
^~    #^~表示普通字符匹配,不是正则匹配。如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
=      #进行普通字符精确匹配
@     #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

 

 

参考:https://segmentfault.com/a/1190000002797606

 

 

location 优先级官方文档

 

1. Directives with the = prefix that match the query exactly. If found, searching stops.

2. All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops.

3. Regular expressions, in order of definition in the configuration file.

4. If #3 yielded a match, that result is used. Else the match from #2 is used.

 

1. =前缀的指令严格匹配这个查询。如果找到,停止搜索。

2. 所有剩下的常规字符串,最长的匹配。如果这个匹配使用^前缀,搜索停止。

3. 正则表达式,在配置文件中定义的顺序。

4. 如果第3条规则产生匹配的话,结果被使用。否则,如同从第2条规则被使用。

 

顺序 no优先级: (location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)

 

例如:

location  = / {
  # 只匹配"/".
  [ configuration A ] 
}
location  / {
  # 匹配任何请求,因为所有请求都是以"/"开始
  # 但是更长字符匹配或者正则表达式匹配会优先匹配
  [ configuration B ] 
}
location ^~ /images/ {
  # 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
  [ configuration C ] 
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配以 gif, jpg, or jpeg结尾的请求. 
  # 但是所有 /images/ 目录的请求将由 [Configuration C]处理.   
  [ configuration D ] 
}

 

 

 

我的疑问1 : 如果是以下的 

  • /images/1.gif -> 会匹配C还是D呢?  会按顺序匹配到C。因为都是正则所以按顺序匹配到了C

location ~ /images/ {
  # 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
  [ configuration C ] 
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配以 gif, jpg, or jpeg结尾的请求. 
  # 但是所有 /images/ 目录的请求将由 [Configuration C]处理.   
  [ configuration D ] 
}

 

 

我的疑问2: 如果是以下的。会匹配到D ,因为正则匹配到优先级大于部分起始路径。

location  /images/ {
  # 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
  [ configuration C ] 
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配以 gif, jpg, or jpeg结尾的请求. 
  # 但是所有 /images/ 目录的请求将由 [Configuration C]处理.   
  [ configuration D ] 
}

 

 

 

 

 

if 条件判断:

参考:

http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_rewrite_module.html#if

 

语法:if (condition) { ... }
默认值:
上下文:serverlocation

计算指定的condition的值。如果为真,执行定义在大括号中的rewrite模块指令,并将if指令中的配置指定给请求。if指令会从上一层配置中继承配置。

条件可以是下列任意一种:

  • 变量名;如果变量值为空或者是以“0”开始的字符串,则条件为假;

  • 使用“=”和“!=”运算符比较变量和字符串;

  • 使用“~”(大小写敏感)和“~*”(大小写不敏感)运算符匹配变量和正则表达式。正则表达式可以包含匹配组,匹配结果后续可以使用变量$1..$9引用。如果正则表达式中包含字符“}”或者“;”,整个表达式应该被包含在单引号或双引号的引用中。

  • 使用“-f”和“!-f”运算符检查文件是否存在;

  • 使用“-d”和“!-d”运算符检查目录是否存在;

  • 使用“-e”和“!-e”运算符检查文件、目录或符号链接是否存在;

  • 使用“-x”和“!-x”运算符检查可执行文件;

 

举例:

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}

if ($request_method = POST) {
    return 405;
}

if ($slow) {
    limit_rate 10k;
}

if ($invalid_referer) {
    return 403;
}

 

案例每个用户的guid存在cookie中要存入nginx日志 如果存在的话:

    set $guid "-";

    if ( $http_cookie ~* "guid=(\S+)(;.*|$)"){

        set $guid $1;

    }

 

内嵌变量$invalid_referer的值是通过valid_referers指令设置的。

 

补充正则表达式知识:

参考:https://regex101.com/

(?:;|$)
(;|$)

两者的区别即 ?:的作用。加上?:在分组中表示不捕捉这个分组,在后面不可以引用 Non-capturing group 

(?:;|$)

Capturing Group 

(;|$)

 

 

 

 

rewrite 模块

 

重写语法:

http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_rewrite_module.html#if

 

语法:rewrite regex replacement [flag];
默认值:
上下文:serverlocationif

如果指定的正则表达式能匹配URI,此URI将被replacement参数定义的字符串改写。rewrite指令按其在配置文件中出现的顺序执行。flag可以终止后续指令的执行。如果replacement的字符串以“http://”或“https://”开头,nginx将结束执行过程,并返回给客户端一个重定向。

可选的flag参数可以是其中之一:

  • last

  • 停止执行当前这一轮的ngx_http_rewrite_module指令集,然后查找匹配改变后URI的新location;

  • break

  • 停止执行当前这一轮的ngx_http_rewrite_module指令集;

  • redirect

  • 在replacement字符串未以“http://”或“https://”开头时,使用返回状态码为302的临时重定向;

  • permanent

  • 返回状态码为301的永久重定向。

 

 

如果URI中含有参数(/app/test.php?id=5),默认情况下参数会被自动附加到替换串上,可以通过在替换串的末尾加上?标记来解决这一问题。
例如:
 

复制代码代码示例:

rewrite ^/test(.*)$ http://www.it.net.cn/home  permanent;
访问http://www.it.net.cn/test?id=5 会跳转到 http://www.it.net.cn/home?id=5
 

例如:如果将类似URL /photo/123456 重定向到 /path/to/photo/12/1234/123456.png
 

复制代码代码示例:

Rewrite "/photo/([0-9]{2})([0-9]{2})([0-9]{2})" /path/to/photo/$1/$1$2/$1$2$3.png ;

 

 

 

set指令。这里的变量名和php的语法差不多。变量名前面定义$代表定义变量(set)或者引用变量。

Syntax:set $variable value;
Default:
Context:serverlocationif

Sets a value for the specified variable. The value can contain text, variables, and their combination.

转载于:https://my.oschina.net/u/3367404/blog/2934409

相关文章:

  • zabbix 4.0 安装配置
  • spark完整的数据倾斜解决方案
  • 程序员如何选择第一家公司
  • zabbix之 自动发现磁盘io util 监控
  • 通用点赞设计思路
  • MVVM模块化架构
  • EF Core中执行Sql语句查询操作之FromSql,ExecuteSqlCommand,SqlQuery
  • 随手记统一监控平台Focus设计解析
  • Centos7 系统启动docker报错 inotify add watch failed
  • 以OpenGL/ES视角介绍gfx-hal(Vulkan) Texture接口使用
  • 阿里云应用高可用服务公测发布
  • JAVA入门到精通-第57讲-SQLserver数据类型
  • 利用keepalived实现高可用nginx(修改正)
  • iPhone XS JavaScript性能飙升背后的秘密
  • Java 基础语法
  • .pyc 想到的一些问题
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 0x05 Python数据分析,Anaconda八斩刀
  • codis proxy处理流程
  • crontab执行失败的多种原因
  • JS 面试题总结
  • leetcode讲解--894. All Possible Full Binary Trees
  • Lucene解析 - 基本概念
  • MaxCompute访问TableStore(OTS) 数据
  • MobX
  • October CMS - 快速入门 9 Images And Galleries
  • Vue ES6 Jade Scss Webpack Gulp
  • vue-loader 源码解析系列之 selector
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 浮动相关
  • 官方解决所有 npm 全局安装权限问题
  • 基于遗传算法的优化问题求解
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 如何设计一个微型分布式架构?
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我看到的前端
  • 容器镜像
  • 如何用纯 CSS 创作一个货车 loader
  • 移动端高清、多屏适配方案
  • ​力扣解法汇总946-验证栈序列
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #Linux(权限管理)
  • $forceUpdate()函数
  • (10)ATF MMU转换表
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)Android学习笔记 --- android任务栈和启动模式