Nginx 配置文件 location 块匹配解读

location 可以理解为 映射/虚拟目录, 其结构如下.

location / {
    root html;
    index index.html;
    error_page 404 /404.html
}

简单看为

location [ = | ~ | ~* | ^~ ] uri {
    
}

location URI {} 对当前路径及子路径下的所有对象都生效;
location = URI {} 注意URL最好为具体路径。 精确匹配指定的路径,不包括子路径,因此,只对当前资源生效;
location ~ URI {} 模式匹配URI, 此处的URI可使用正则表达式, 区分字符大小写.
location ~* URI {} 模式匹配URI, 此处的URI可使用正则表达式, 不区分字符大小写.
location ^~ URI {} 用于普通URI,当找到一个匹配的location,立即使用它处理而不再使用正则URI和请求字符串匹配
优先级:= > ^ ~ > ~ * > ~

uri 是待匹配的请求字符串, 可以是普通字符串如: /my.php.
也可以是正则表达式字符串如 \.php$


例:
location = /{}

默认配置的意思,由于任何URI 都必然以 /根开头,所以对于一个URI,如果有更精准的匹配,那自然是选更精确的,如果没有,"/"一定能为这个URI垫背(至少能匹配到 "/")
http://localhost/ 会403,禁止访问.
http://localhost/asd 会404,没有这个页面

location ^~ uri{}

普通的 location 匹配完后,会继续匹配正则,如果你想停止这种行为,可以在uri前加上 ^~.

location ^~ /images/{}

匹配所有以/images/开头的,并且停止正则匹配,不继续向下找location,匹配到就停止

location ~* \.(gif|jpg|jpeg)${}

匹配所有以gif jpg jpeg为后缀的请求

location 匹配规则

普通location之间的匹配顺序
  • 和书写顺序无关.
  • 遵循最大匹配前缀原则.

例:
location 配置如下
location /bbs/mi4{ deny all; }
location /bbs/{ allow all; }
如果URI为:
http://localhost/bbs/ ,会匹配到第二个
http://localhost/bbs/mi3/ 匹配到第二个
http://localhost/bbs/ipho/ 匹配到第二个
http://localhost/bbs/mi4/ssasd 匹配第一个

正则 location 之间的匹配顺序
  • 和书写顺序有关
  • 按顺序匹配只要有一个正则被匹配, 则终止后面的匹配


location 配置如下
location ~ /bbs/\d\.html$ {deny all;}
location ~ /bbs/{allow all;}
如果URI为:http://localhost/bbs/1.html,先匹配到哪个location 就为哪个

混搭
  • 普通严格精确匹配 > 正则匹配 > 普通最大前缀匹配(其他普通非严格精确匹配)
  • = /优先级最高,优先匹配
  • ~ /第二优先级
  • / 最低优先级

你可能感兴趣的:(Nginx 配置文件 location 块匹配解读)