nginx之location匹配规则

1.概述

    Nginx server块下的一个指令,每个server块可以包含多个location块。

2.作用

    1)  基于Nginx服务器接收到的请求字符串(例如:server_name/abc),对除虚拟主机名称(也可以是ip别名)之外的字符串(例如:“/abc”)进行匹配,对特定的匹配进行处理;

    2)  地址定向、数据缓存和应答控制等功能都是在这部分实现;

    3)  许多第三方模块的配置也是在location块中提供功能。

3.语法结构

Location [ = | ~| ~* | ^~ ] uri{ … }

    1)uri变量是待匹配的请求字符串,可以是不包含正则表达的字符串,也可以是包含正则的字符串。为了叙述方便,约定下文中,不含正则表达的uri称为“普通uri”,包含正则表达的uri称为“正则uri”。

    2)方括号的部分是可选项,用来改变请求字符串与uri的匹配方式

         a)  = 用于标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求

         b)  ~ 用于表示uri包含正则表达式,并且区分大小写

         c)  ~* 用于表示uri包含正则表达式,并且不区分大小写

        d)  ^~ 用于普通uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。当浏览器在传送URI时会对一部分字符进行URL编码,比如空格被编码为“%20”,问号被编码为“%3f”等。^~有一个特点就是它会对uri中的这些符号进行编码处理。比如,如果location块收到的URI为/html/%20/data,则当nginx服务器搜索到配置为“^~/html/ /data”的location时,可以匹配成功。

4.规则

    “普通uri”和“普通uri”:先是严格匹配,然后是最大前缀匹配。“普通uri”的执行逻辑跟location编辑顺序无关。

    “正则uri”和“正则uri”:按照正则uri在匹配文件中的物理顺序(编辑顺序)匹配的,只要匹配到一条“uri”,就不再考虑后面的。

    “普通uri”和“正则uri”:选择出“普通uri”的最大前缀匹配结果后,还需要继续搜索“正则uri”;搜索到“正则uri”,那么“正则uri”覆盖“普通uri”,但也可以告诉nginx,匹配到了“普通uri”后,不需要继续匹配“正则uri”,只需要在“普通uri”前面加上“^~”符号或者是“=”;不同点是“^~”依然遵循“最大前缀”匹配规则,然后“=”不是最大匹配,而是必须严格匹配(exact match)、只要遇到“精确匹配exact match”,即使普通location没有带“=”或“^~”前缀,也一样会终止后面的匹配。

     /abc 和 /abc/的区别

    1:普通匹配时,前者是文件,后者是目录,精确匹配/abc/

    2:正则匹配/abc/时,/abc不匹配,正则匹配/abc时,/abc/是可以匹配出来的。

    注意:(1)正则匹配可以不写root路径,不写的话就是匹配任何路径。

              (2)“正则uri”让步于“普通uri”的严格精确匹配结果;但覆盖“普通uri”的最大前缀结果。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值