nginx提供了非常灵活的location uri路径匹配功能。在配置文件中格式如下:
语法: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
默认值: —
上下文: server, location
先总结一下location的类型:
-
精确匹配的location
例如:location = /a.txt
匹配一个为/a.txt的uri,完整的url可以是 http://host/a.txt?q=xxx再如:locaiton = /
匹配一个为/的uri, 完整的url可以是 http://host/?q=xxx -
模糊匹配的location
-
前缀匹配
例如:location /a/b/c/
匹配一个以/a/b/c/为前缀路径的uri
完整的url可以是 http://host/a/b/c/x.jpg,或者:http://host/a/b/c/xxx/m.php?q=xxxx -
正则匹配
-
不忽略大小写
例如:location ~* .(gif|jpg|jpeg)$
匹配所有以gif或者jpg或者jpeg为文件扩展名的uri,并且后缀名不区分大小写 -
忽略大小写
例如: location ~ .mp4$
匹配所有以mp4为扩展名的uri,并且区分后缀名的大小写 -
正则前缀匹配
例如:location ^~ /images
匹配所有以/images开头的uri
-
-
-
默认匹配的location
例如:location /
匹配所有uri的请求 -
命名location
即以@开头的location,命名location不能嵌套。
命名location不会匹配任何uri的请求,命名 ”location“ 的作用是在当前 Nginx 服务器块内部进行重定向,而不是向客户端发送 HTTP 重定向响应。它通常用于在同一个服务器块内部处理请求的不同部分,以实现代码的重用和简化配置。它也是非常有用的,有时候我们可以通过lua脚本(在openresty中)或者自研nginx插件模块,根据相应的业务规则将某些请求转发到特定的命名location中执行相应的业务逻辑。
nginx在匹配配置文件中的location前,先会对uri进行规范化,将%XX的编码进行解码,然后解析相对路径组件中的引用 “.” 和 “…”,并将出现的连续两个或多个相邻斜杠压缩为单个斜杠。然后开始匹配:
- nginx执行精确匹配,匹配则选中该location并结束;
- nginx执行最长前缀匹配,无论是否选出最长匹配,都还需要继续进行第3步;
- 按配置文件中的顺序搜索正则location规则,直到匹配到第一个location规则,选中该location并结束。如果所有正则规则都没有匹配到,并且第二步已经最长匹配到了某个location,则选中该location并结束;
- 如果有默认匹配的location,则选中它并结束。
- 匹配失败,nginx最终返回404。