设为首页 收藏本站
查看: 802|回复: 0

[经验分享] nginx location if 的匹配规则

[复制链接]

尚未签到

发表于 2018-11-10 07:36:25 | 显示全部楼层 |阅读模式
  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) { ... }默认值:—上下文:server, location  计算指定的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];默认值:—上下文:server, location, if  如果指定的正则表达式能匹配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:server, location, if  Sets a value for the specified variable. The value can contain text, variables, and their combination.



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-633024-1-1.html 上篇帖子: Nginx优化与防盗链 下篇帖子: Nginx模型以及介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表