徐善通的随笔

千里之行, 始于足下



Nginx location配置详解


location 表达式类型

  • ~ 表示执行一个正则匹配,区分大小写
  • ~* 表示执行一个正则匹配,不区分大小写
  • ^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。
  • = 进行普通字符精确匹配。也就是完全匹配。
  • space 通用匹配,匹配前缀 格式一般为 location[space]/,优先级最低

普通匹配:

  • location = URI { configuration } #精确匹配,匹配成功立即返回
  • location ^~ URI { configuration } #前缀匹配,匹配成功立即返回
  • location [space] URI { configuration} # # 前缀匹配, 不返回,等待正则匹配结果

正则匹配

  • location ~ URI { configuration } #大小写敏感匹配
  • location ~* URI { configuration } #大小写不敏感匹配

location 示例

1.精准匹配

location = /abc {
    ……
}

如下是匹配的
# http://website.com/abc
# http://website.com/abc?name=abcdd&age=100 因为不会去匹配query_string
可能会匹配,也可以不匹配,取决于操作系统的文件系统是否大小写敏感
# http://website.com/ABC
如下是不匹配的
# http://website.com/abc/
# http://website.com/abc/bbb

2.精准前缀匹配

location ^~ /abc {
    ……
}

如下是匹配的
# http://website.com/abc
# http://website.com/abc/
# http://website.com/abcdefg?name=abcdd&age=100
如下是不匹配的
# http://website.com/abd
# http://website.com/ab

3.常规匹配

location /abc {
    ……
}

如下是匹配的
# http://website.com/abc
# http://website.com/abc/
# http://website.com/abcdefg?name=abcdd&age=100
如下是不匹配的
# http://website.com/abd
# http://website.com/ab

他和 ^~ 唯一的区别就是当命中一个规则时, 不会停止匹配

4.区分大小写正则匹配

location ~* /abc$ {
    ……
}

如下是匹配的
# http://website.com/abc
# http://website.com/abc?name=string&aa=bb
如下是不匹配的
# http://website.com/Abc
# http://website.com/abcde

5.不区分大小写正则匹配

location ~ /abc$ {
    ……
}

如下是匹配的
# http://website.com/aBc
# http://website.com/ABC
# http://website.com/abc?name=string&aa=bb
如下是不匹配的
# http://website.com/abcde

匹配优先级

  1. 先进性精准匹配,如果命中立即返回结果并结束解析的过程;
  2. 精准匹配未命中进行 ^~前缀匹配, 如果命中立即返回结果
  3. 精准匹配未命中判断普通匹配,如果命中多个会记录下"最长的"命中结果,但不会结束解析;
  4. 继续判断正则匹配,按照正则匹配设置的规则正则表达式进行匹配,如果有多个正则匹配由上到下进行匹配,一旦匹配成功一个会立即返回结果并结束解析.

普通匹配的前后顺序是无所谓的,因为记录的是最长的结果,而正则匹配是按从上到下匹配的,这个需要注意!!!

root 、alias指令区别

location /img/ {
    alias /var/www/image/;
}

若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件

location /img/ {
    root /var/www/image/;
}

若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。]
alias是一个目录别名的定义,root则是最上层目录的定义。

还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。。。而root则可有可无

演示

location = / {
  # 只匹配 / 的查询.
}
location / {
  # 匹配任何以 / 开始的查询,但是正则表达式与一些较长的字符串将被首先匹配。
}
location ^~ /images/ {
  # 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式。
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配任何以gif, jpg, or jpeg结尾的文件,但是所有 /images/ 目录的请求将该段处理
}

作者: 徐善通
地址: https://www.xstnet.com/article-107.html
声明: 除非本文有注明出处,否则转载请注明本文地址


我有话说



最新回复


正在加载中....

Copyrights © 2016-2019 醉丶春风 , All rights reserved. 皖ICP备15015582号-1