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

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

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

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

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

location  /p_w_picpaths/ {
  # 匹配任何以 /p_w_picpaths/ 开始的请求,并停止匹配 其它location
  [ configuration C ] 
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配以 gif, jpg, or jpeg结尾的请求. 
  # 但是所有 /p_w_picpaths/ 目录的请求将由 [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://blog.51cto.com/cuidehua/1874770

nginx location if 的匹配规则的更多相关文章

  1. nginx location标签的匹配规则

    location的匹配 匹配符 匹配规则 优先级 = 精确匹配 1 ^~ 以某个字符串开头 2 ~ 区分大小写的正则匹配 3 ~* 不区分大小写的正则匹配 4 !~ 区分大小写不匹配的正则 5 !~* ...

  2. Nginx Location指令URI匹配规则详解

    server { listen 80; server_name ss.test *.ss.test; root "D:/Project/PHP/admin-h5/dist/"; s ...

  3. 07 nginx Location之正则匹配

    一:Location之正则匹配 再来看,正则也来参与. location / { root   /usr/local/nginx/html; index  index.html index.htm; ...

  4. Nginx之location 匹配规则详解

    有些童鞋的误区 1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我,因为按“先匹配普通, ...

  5. Nginx 关于 location 的匹配规则详解

    有些童鞋的误区 1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我,因为按“先匹配普通, ...

  6. Nginx localtion匹配规则

    mark:2016年05月25日13:20:54 (存手打,拒绝转载) 一.location分为 普通location 和 正则location 只有带有 "~" 或者" ...

  7. Nginx Location配置总结

    Nginx Location配置总结 语法规则: location [=|~|~*|^~] /uri/ { - }= 开头表示精确匹配^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即 ...

  8. nginx location 的配置

    一.基本语法:location [=|~|~*|^~] /uri/ { … } 二.分类: 1.基本location:以“ = ”或“ ^~ ”为前缀或者没有任何前缀的 /uri/ 2.正则locat ...

  9. nginx location的配置

    文章转自:http://www.ttlsa.com/nginx/nginx-location-configure/ location的语法配置规则: 语法规则: location [=|~|~*|^~ ...

随机推荐

  1. [转帖]Oracle数据库lob大对象数据类型字段总结,值得收藏

    Oracle数据库lob大对象数据类型字段总结,值得收藏 原创 波波说运维 2019-07-11 00:02:00 https://www.toutiao.com/i67108943269703357 ...

  2. php去掉字符串中的最后一个字符和汉字

    ###php去掉字符串中的最后一个字符和汉字 1.php去掉字符串中的最后一个字符: //方法一: $newstr = substr($str,0,strlen($str)-1); //方法二: $n ...

  3. python学习-24 局部变量与全局变量

    局部变量与全局变量 1.没有缩进的变量,为全局变量 name = 'jphn' 在子程序里定义的变量,局部变量 2. name = 'jphn' #全局变量 def a(): name='andy' ...

  4. SAS学习笔记30 SAS各种常用随机函数

    UNIFORM(seed) 产生(0,1)区域均匀分布随机数,乘同余发生器 RANUNI(seed) 产生(0,1)区域均匀分布随机数,素数模发生器 NORMAL(seed) 产生标准正态分布随机数, ...

  5. 谷歌大脑提出:基于NAS的目标检测模型NAS-FPN,超越Mask R-CNN

    谷歌大脑提出:基于NAS的目标检测模型NAS-FPN,超越Mask R-CNN 朱晓霞发表于目标检测和深度学习订阅 235 广告关闭 11.11 智慧上云 云服务器企业新用户优先购,享双11同等价格 ...

  6. DP动态规划学习笔记——高级篇上

    说了要肝的怎么能咕咕咕呢? 不了解DP或者想从基础开始学习DP的请移步上一篇博客:DP动态规划学习笔记 这一篇博客我们将分为上中下三篇(这样就不用咕咕咕了...),上篇是较难一些树形DP,中篇则是数位 ...

  7. 西门子软件sinutrain-for-sinumerik-operate-v4.8安装报错的处理

       西门子软件sinutrain-for-sinumerik-operate-v4.8安装报错的处理 安装时报错提示: 原因: 可能缺少某些文件 处理: 安装 海康ivms-4200后,可直接安装西 ...

  8. LeetCode 1047. Remove All Adjacent Duplicates In String

    1047. Remove All Adjacent Duplicates In String(删除字符串中的所有相邻重复项) 链接:https://leetcode-cn.com/problems/r ...

  9. springboot启动流程(五)创建ApplicationContext

    所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 springboot在启动过程中将会根据当前应用的类型创建对应的ApplicationC ...

  10. ifeq ifneq ifdef ifndef

    条件语句中使用到了三个关键字:“ifeq”.“else”和“endif”.其中: 1.        “ifeq”表示条件语句的开始,并指定了一个比较条件(相等).之后是用圆括号括包围的.使用逗号“, ...