location的基本语法
location [ = | ~ | ~* | ^~ ] uri { ... }
模式 | 含义 |
---|---|
location = /uri | = 表示精确匹配,只有完全匹配上才能生效 |
location ^~ /uri | ^~ 开头对URL路径进行前缀匹配,并且在正则之前。 |
location ~ pattern | 开头表示区分大小写的正则匹配 |
location ~* pattern | 开头表示不区分大小写的正则匹配 |
location /uri | 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后 |
location / | 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default |
多个location配置的情况下的匹配顺序
- 首先精确匹配 =
- 其次前缀匹配 ^~
- 其次是按文件中顺序的正则匹配
- 然后匹配不带任何修饰的前缀匹配。
- 最后是交给 / 通用匹配
- 当有匹配成功时候,停止匹配,按当前匹配规则处理请求
例子
location =/ {
#规则A
return 601;
}
location / {
#规则B
return 602;
}
location /documents/ {
#规则C
return 603;
}
location ~ /documents/Abc {
#规则D
return 604;
}
location ^~ /images/ {
#规则E
return 605;
}
location ~* \.(gif|jpg|jpeg)$ {
#规则F
return 606;
}
location /images/abc {
#规则G
return 607;
}
location ~ /images/abc/ {
#规则H
return 608;
}
按照上面的匹配规则,匹配的效果如下
/ | 601 | 精确完全匹配,即使/index.html也匹配不了 |
/login/login.html | 602 | 匹配B以后,往下没有任何匹配 |
/documents/document.html | 603 | 匹配C以后,往下没有任何匹配 |
/documents/Abc.jpg | 604 | 最长匹配到C,往下正则顺序匹配到D,不会往下到F |
/images/1.gif | 605 | 最长匹配到E,不会往下到F |
/photo/screen.jpg | 606 | 匹配F以后,往下没有任何匹配 |
/images/abc.jpg | 606 | 正则匹配优先于不带任何修饰的前缀匹配,匹配F以后,不会往下到H |
/images/abc.html | 607 | 匹配H以后,往下没有任何匹配 |
/images/abc/test.png | 608 | 正则匹配优先于不带任何修饰的前缀匹配,匹配H以后,往下没有任何匹配 |