Nginx 通过不同的 location 配置来匹配访问的 uri. 这样便可以做到对不同的 uri 执行不同的操作.
语法
location 的路径匹配可以分为两种: 前缀匹配和正则匹配, 基本语法为:
location [ = | ~ | ~* | ^~ ] uri {
...
}
前缀匹配
- 精确前缀匹配:
location = uri {...} - 优先前缀匹配:
location ^~ uri {...} - 普通前缀匹配:
location uri {...}
正则匹配
- 大小写敏感:
location ~ uri {...} - 大小写不敏感:
location ~* uri {...}
匹配规则
- 首先检查使用前缀匹配的 location:
- 如果找到了精确匹配的 location(
=), 则结束查找, 直接使用该 location 的配置; - 如果最长匹配的 location 是优先前缀匹配(
^~), 也结束查找, 使用该 location 的配置 - 记录下最长匹配的 location
- 如果找到了精确匹配的 location(
- 然后按照顺序检查使用正则匹配的 location:
- 一旦匹配则结束查找, 直接使用匹配上的的 location 的配置
- 如果找完所有的正则匹配后还是没有匹配到, 则采用前缀匹配查找时记录下来的的最长匹配项的 location 的配置
栗子:
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
以上配置中:
/: 精确匹配 A, 则直接采用配置 A, 不再继续检查./index.html: 首先检查前缀匹配, 最长匹配为 B; 然后检查正则匹配, 未匹配到, 则采用配置 B./documents/documents.html/: 首先检查前缀匹配, 最长匹配为 C; 然后检查正则匹配, 未匹配到, 则采用配置配 C./images/pic.jpg: 首先检查前缀匹配, 匹配到最长匹配为 D, 此时 D 为优先前缀匹配, 不再继续检查, 直接采用配置 D;/documents/pic.jpg: 首先检查前缀匹配, 最长匹配为 C; 然后按照顺序检查正则匹配, 匹配了 E, 则停止检查, 直接采用配置 E.
URI 尾部斜杠
location 前缀匹配中是否已以斜线 / 结尾不会对匹配结果产生影响.
在访问的时候如果没有斜杠结尾, 那么 Nginx 会默认返回带斜杠的 301 重定向. 比如:
不带 slash 访问

