简介

location 资源匹配的规则与匹配指令和 url 匹配模式有关。其中匹配指令决定了匹配方式,指令 + 模式决定了匹配哪些资源。每个规则大概长这样:

  1. location [匹配指令] url匹配模式 {
  2. ...
  3. }

若 location 匹配规则中有匹配指令(=、^ ~、~*),则称此匹配为:精准匹配、前缀匹配和正则匹配;没匹配指令,称为正常匹配或全局匹配。

精准匹配

= 用于精准匹配。此时 url 匹配模式不可使用正则(用了也无效),区分大小写,例如:

  1. location = /demo {
  2. rewrite ^ http://baidu.com;
  3. }

上述配置表示:只有请求的路径是 /demo 时,才会跳转(转发)到百度搜索,除此之外都会异常。

前缀匹配

^~ 用于前缀匹配。此时 url 匹配模式不可使用正则,区分大小写,和 = 不同的是,它匹配的请求路径并不固定,只要是请求路径的前缀和 ^~ 设置的前缀一样即可,例如:

  1. location ^~ /demo {
  2. rewrite ^ http://baidu.com;
  3. }

上述配置表示:只要请求路径前缀是 /demo 时,均可跳转。以下请求路径都能被匹配到:/demo、/demo.jpg、/demo/a、/demoaaa。

正则匹配:

~、~* 用于正则匹配,这样能匹配的范围更广了。注意:前者区分文件大小写,后者不区分文件大小写。
正则匹配允许匹配模式可使用正则,例如:

  1. location ~ /[abcd]emo[\d] {
  2. rewrite ^ http://google.com;
  3. }

按照上述配置表示,以下的请求的路径都会匹配:/aemo9、/demo0、/demo1、/demo2。如果不区分路径大小写,把 ~ 替换成 ~* 即可。

正常匹配

没有匹配指令即为正常匹配,此时 url 的匹配模式可以使用正则,不区分大小写。例如:

  1. location /demo {
  2. rewrite ^ http://google.com;
  3. }

按照上述匹配模式,可匹配到:/demo、/demo/a、/demo/a/b、/demo.jpg、/deMO.AAA、/DEmO.BbB…。

全局匹配

全局匹配可以看作正常匹配的特殊一种,它的 url 匹配模式仅是 /。

  1. location / {
  2. rewrite ^ http://google.com;
  3. }

表示该 server 下的任何一个路径请求,都会跳转。

匹配优先级

按照上述介绍匹配的顺序,优先级为:

  1. 精准匹配 > 前缀匹配 > 正则匹配 > 正常匹配 > 全局匹配

这是大的原则,还有小细节,是针对相同匹配类型来制定的:
1、正则匹配成功后停止匹配,非正则匹配成功后会继续匹配;
2、在所有匹配成功的 url 中,选取匹配长度最长的 url 匹配模式;

不同级别匹配优先级

精准匹配 > 前缀匹配

  1. location = /demo {
  2. rewrite ^ http://baidu.com;
  3. }
  4. location ^~ /demo {
  5. rewrite ^ http://google.com;
  6. }

请求和对应的匹配为:/demo => baidu.com、/demo/a => google.com。把前缀匹配换成正则匹配也一样,精准匹配是最大。

前缀匹配 > 正则匹配

  1. location ~ /dem[oi] {
  2. rewrite ^ http://google.com;
  3. }
  4. location ^~ /demo {
  5. rewrite http://baidu.com;
  6. }

请求和对应的匹配为:/demo => baidu.com、/demoi => google.com,可见即使正则匹配先匹配到,也是没前缀匹配优先级大。

正则匹配 > 正常匹配

  1. location /demo/ab {
  2. rewrite ^ http://baidu.com;
  3. }
  4. location ~ /demo/ {
  5. rewrite ^ http://google.com;
  6. }

请求和对应的匹配为:/demo => google.com、/demo/ab => google.com,在大规则前,小规则(匹配长度)也是没效果的。

正常匹配 > 全局匹配

  1. location / {
  2. rewrite ^ http://baidu.com;
  3. }
  4. location /demo {
  5. rewrite ^ http://google.com;
  6. }

请求和对应的匹配为:/demo => google.com、/demo/ab => google.com、/ => baidu.com、’’ => index.html。

同级别的匹配优先级

看两个细节:是否是正则匹配、是否是最长匹配。

  1. location /demo {
  2. rewrite ^ http://baidu.com;
  3. }
  4. location /demo/abc {
  5. rewrite ^ http://google.com;
  6. }

请求和对应的匹配为:/demo/ab => baidu.com、/demo/abc => google.com(谁最长匹配谁)。换成前缀匹配也一样。但是换成正则匹配就不同了:

  1. location ~ /demo {
  2. rewrite ^ http://baidu.com;
  3. }
  4. location ~ /demo/abc {
  5. rewrite ^ http://google.com;
  6. }

请求和对应的匹配为:/demo/abc => baidu.com,这是因为正则匹配和最长匹配无关,仅与匹配的顺序有关,匹配到即截至。

location 资源匹配总结

1、按照匹配指令 + url 匹配模式来决定命中的资源;
2、匹配指令具有优先级,按照一大二小的原则;

服务器禁用用户访问 .git 文件夹

  1. location ^~ /\.git {
  2. deny all;
  3. }

参看:

简明 Nginx Location Url 配置笔记