天天看点

nginx location语法规则

1、location指令语法

location [=||*|^~|@] /uri/ { … } 或 location @name { … }

= 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。

为区分大小写匹配(可用正则表达式)

!~为区分大小写不匹配

~* 为不区分大小写匹配(可用正则表达式)

!~*为不区分大小写不匹配

^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。

2、URI匹配模式

location指令分为两种匹配模式:

1> 普通字符串匹配:以=开头或开头无引导字符(~)(其实就是location / {}的模式,或者叫做模糊匹配)的规则

精确匹配与模糊匹配差别

location =/ { … } 与 location / { … } 的差别:

  • 前一个是精确匹配,只响应/请求,所有/xxx或/xxx/xxxx类的请求都不会以前缀的形式匹配到它
  • 后一个是只要以 / 为前缀的请求都会被匹配到。如:/abc , /test/abc, /test/abc/aaaa

    2> 正则匹配:以~或~*开头表示正则匹配,~*表示正则不区分大小写

正则与非正则匹配

location ~ /test/.+.jsp$ { … } :正则匹配,支持标准的正则表达式语法。

  • location ^~ / { … } : ^~意思是关闭正则匹配,当搜索到这个普通匹配模式后,将不再继续搜索正则匹配模式。

    3、location URI匹配规则

    当nginx收到一个请求后,会截取请求的URI部份,去搜索所有location指令中定义的URI匹配模式。在server模块中可以定义多个location指令来匹配不同的url请求,多个不同location配置的URI匹配模式,总体的匹配原则是:先匹配普通字符串模式(普通匹配,匹配到会暂存,继续搜索正则匹配),再匹配正则模式(正则模式匹配到,即为最终匹配)。只识别URI部份,例如请求为:/test/abc/user.do?name=xxxx

    一个请求过来后,Nginx匹配这个请求的流程如下:

    先查找是否有=开头的精确匹配,如:location = /test/abc/user.do { … }

再查找普通匹配,以 最大前缀 为原则,如有以下两个location,则会匹配后一项

location /test/ { … } location /test/abc { … }

*

匹配到一个普通格式后,搜索并未结束,而是暂存当前匹配的结果,并继续搜索正则匹配模式

*

所有正则匹配模式location中找到第一个匹配项后,就以此项为最终匹配结果

所以正则匹配项匹配规则,受定义的前后顺序影响,但普通匹配模式不会

*

如果未找到正则匹配项,则以3中缓存的结果为最终匹配结果

*

如果一个匹配都没搜索到,则返回404

匹配规则总结

1.先精确匹配("="),如果精确匹配到了就停止搜索。

2.精确匹配失败,进行普通匹配(模糊匹配)(无引导符号),如果模糊匹配成功,将结果暂存,继续进行正则匹配(按从上往下的顺序执行),匹配到第一个正则表达式则返回最终结果,如果没匹配到就返回前面暂存的模糊匹配结果。

3.精确匹配失败,进行普通匹配(模糊匹配)(有引导符号,^~),如果模糊匹配成功,将结果返回,不继续进行正则匹配。

参考:https://zhuanlan.zhihu.com/p/104212411

继续阅读