• 运维特工,战胜心魔!!
  • 有些事情其实没有那么难,只是我们感觉难,走出第一步!
  • 你所浪费的今天,是昨天死去的人奢望的明天!!!
  • 欢迎访问 unixfbi.com 运维特工社区http://unixfbi.com/
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧
  • 运维特工:http://www.unixfbi.com
  • 人生没有白走的路,每一步都算数!!
  • 空杯心态,沉淀自己!

Nginx location匹配规则介绍

Linux知识 unixfbi 8个月前 (10-26) 1900次浏览 已收录 0个评论 扫描二维码

Nginx location 匹配规则介绍

1.location 介绍

location 规则在 Nginx 中是必不可以少的配置,配置 location 规则后可以根据用户请求的 URI,把请求代理到不同的应用程序上以便得到期待的结果。

2.location 配置语法:

location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }

= 表示严格精确匹配
~~*是正则匹配,~区分大小写。~*不区分大小写
^~表示匹配到该规则后,直接返回结果,不会再去匹配其他 location 或者正则的规则了。
它定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

官方举例:
使用版本为 nginx/1.14.0

location = / {   #精确匹配/
    [ configuration A ]
}

location / {     #所有规则都没有匹配,最后匹配这个规则
    [ configuration B ]
}

location /documents/ {   
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索。如果有正则表达式可以匹配,则优先匹配正则表达式。

    [ configuration C ]
}

location ^~ /images/ {
匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找。所以,即便有符合的正则表达式 location,也不会被匹配了。

    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif jpg jpeg 结尾的请求。但是 以 /images/开头的请求,将使用 Configuration D
    [ configuration E ]
}

The “/” request will match configuration A;
the “/index.html” request will match configuration B;
the “/documents/document.html” request will match configuration C;
the “/images/1.gif” request will match configuration D,;
the “/documents/1.jpg” request will match configuration E

3.location 规则匹配顺序

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
location 匹配顺序是“先匹配普通,再匹配正则”,location 在匹配的时候就算是匹配到普通规则了,也会再去匹配正则规则。
有两种情况是匹配到普通的规则也不会再去匹配正则规则了:
(1)如果匹配到的普通规则使用了^~,就不会继续正则匹配了。
(2)普通 location 规则恰好严格匹配上(= 全路径),不是最大前缀匹配,则不再继续匹配正则。

locaiton 匹配输出结果优先级
- =优先级最高,一旦匹配成功,则不再查找其他匹配项
- ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
- ~~*正则表达式优先级次之。一旦匹配成功,则不再查找其他匹配项。location 正则规则是有顺序的,优先匹配最前面的规则。
- 常规字符串匹配,如果有多个 locaiton 匹配的话,则使用表达式最长的那个规则;

普通规则匹配,和顺序没有关系,因为是按照命中的长短来确定的。
正则匹配规则,是有顺序区别的,因为是从前往后匹配。匹配到前面的规则就停止后面的搜索,不会匹配后面的正则规则了。

测试匹配输出结果顺序:

server {
        listen       80;
        server_name  www.unixfbi.com;
        server_tokens off;

        location  = /images/b.gif {
                return 400;
        }

        location  /images/b.gif {
                return 401;
        }       
        location ^~ /images {
                 return 402;
        }
        location ~* /images {
                return 405;
        }

        location ~* \.gif$ {
                return 406;
        }

        location \ {
                return 407;
        }
}

测试 1:

# curl -s -o /dev/null -w "%{http_code}\n" www.unixfbi.com/images/b.gif
400

结论:优先匹配location = /images/b.gif { return 400; }规则。=的优先级最高。

测试 2:
注释掉规则location = /images/b.gif {return 400;}

# curl -s -o /dev/null -w "%{http_code}\n" www.unixfbi.com/images/b.gif
405

结论:匹配到的是第一个正则location ~* /images {return 405;},最后返回的结果是正则规则。其实首先匹配的是最长最长普通规则location = /images/b.gif {return 400;},因为是普通规则,所以还会去匹配正则规则,发现正则规则匹配成功就返回了。

测试 3:
继续注释掉规则location /images/b.gif {return 401;}

# curl -s -o /dev/null -w "%{http_code}\n" www.unixfbi.com/images/b.gif
402

结论:匹配到的是location ^~ /images {return 402;},也说明了匹配到^~就不会匹配正则了。

测试 4:
继续注释掉规则location ^~ /images {return 402;}

# curl -s -o /dev/null -w "%{http_code}\n" www.unixfbi.com/images/b.gif
405

结论:匹配到的是第一个正则规则;

测试 5:
继续注释掉第一个正则规则location ~* /images {return 405;}

# curl -s -o /dev/null -w "%{http_code}\n" www.unixfbi.com/images/b.gif
406

结论:发现匹配的是第二个正则规则了。这也说明了正则规则是有顺序要求的。

测试 6:
继续注释掉第二个正则规则location ~* \.gif$ {return 406;},最后只有一个location / {return 407;}规则了。

# curl -s -o /dev/null -w "%{http_code}\n" www.unixfbi.com/images/b.gif
407

结论:其他规则都注释后,默认是找location / {return 407;}规则。

下面再做详细单规则测试:

测试严格精确匹配(= 全路径)与正则规则:

location = /images/a.gif {
        return 400;
}

location ~* /images {
        return 405;
}

out:

# curl -s -o /dev/null -w "%{http_code}\n" www.unixfbi.com/images/b.gif
400

测试最大前缀路径与正则规则:

location /images/a.gif {
        return 401;
}

location ~* /images {
        return 405;
}

out:

# curl -s -o /dev/null -w "%{http_code}\n" www.unixfbi.com/images/b.gif
405

结论:最后返回结果是正则。其实最先匹配的是最长普通规则,然后又去匹配正则规则了,最后返回的也是正则规则的结果。

^~与正则~*规则:

location ^~ /images {
    return 402;
}
location ~* /images {
        return 405;
}

out:

# curl -s -o /dev/null -w "%{http_code}\n" www.unixfbi.com/images/b.gif
402

结论:匹配^~ 后,不会再去匹配正则规则了,立刻返回结果。

^~与全路径规则:

location ^~ /images {
    return 402;
}
location  /images/b.gif {
        return 401;
}

out:

# curl -s -o /dev/null -w "%{http_code}\n" www.unixfbi.com/images/b.gif
401

结论:匹配的结果是全路径。

测试正则顺序:

location  /images/b.gif {
        return 401;
}

location ~* /images {
        return 405;
}
location ~* \.(gif)$ {
        return 406;
}

out:

# curl -s -o /dev/null -w "%{http_code}\n" www.unixfbi.com/images/b.gif
405

输出的是第一个正则的结果;
然后我们把location ~* \.(gif)$ {}location ~* /images {}调换顺序

location  /images/b.gif {
        return 401;
}

location ~* \.(gif)$ {
        return 406;
}
location ~* /images {
        return 405;
}

out:

# curl -s -o /dev/null -w "%{http_code}\n" www.unixfbi.com/images/b.gif
406

从上面两个测试结果可以看出,正则规则是有顺序区别的,匹配到前面的规则就停止后面的搜索,不会匹配后面的正则规则了。

测试普通最长规则、正则规则和^~规则:

location  /images/b.gif {
    return 401;
}       
location ^~ /images {
    return 402;
}
location ~* /images {
        return 405;
}

out:

# curl -s -o /dev/null -w "%{http_code}\n" www.unixfbi.com/images/b.gif
405

为什么返回的是 405 不是 402 呢?
这个主要是看开始匹配的规则,因为开始匹配的全路径,然后匹配的是正则规则,匹配到正则后直接就返回了。如果没有全路径的话,会匹配 402 并直接返回。

location ^~ /images {
    return 402;
}
location ~* /images {
        return 405;
}

out:

# curl -s -o /dev/null -w "%{http_code}\n" www.unixfbi.com/images/b.gif
402

4.location @xxx 的作用

如果请求的 URI 存在,则本机 Nginx 直接返回对应的页面。如果不存在 code 是 404,那么就会把请求代理到其他页面。配置这个可以把网站 404 请求都重定向到指定的页面,提高用户体验。

error_page 404 = @fallback;

location @fallback {
         proxy_pass http://www.unixfbi.com;
}

out:

# curl -I 127.0.0.1/dd/b.log                                 
HTTP/1.1 302 Found
Server: nginx/1.14.0
Date: Wed, 24 Oct 2018 11:38:36 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: keep-alive
Cache-Control: max-age=86400
Expires: Thu, 25 Oct 2018 11:38:36 GMT
Location: https://www.unixfbi.com/search/error.html

参考文档

http://nginx.org/en/docs/http/ngx_http_core_module.html#location


UnixFBI 运维特工 , 版权所有丨如未注明 , 均为原创丨 转载请务必注明原文链接http://www.unixfbi.com/594.html
喜欢 (3)
[支付宝]
分享 (0)
unixfbi
关于作者:
运维工程师一枚,做有价值的事情!
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址