匹配规则:
符号 | 说明 |
---|
~ | 正则匹配,区分大小写 | ~* | 正则匹配,不区分大小写 | ^~ | 普通字符匹配,如果该选项匹配,则,只匹配改选项,不再向下匹配其他选项 | = | 普通字符匹配,精确匹配 | @ | 定义一个命名的 location,用于内部定向,例如 error_page,try_files |
匹配优先级
路径匹配,优先级:(跟 location 的书写顺序关系不大)
- 精确匹配:=前缀的指令严格匹配这个查询。如果找到,停止搜索。
- 普通字符匹配:所有剩下的常规字符串,最长的匹配。如果这个匹配使用^?前缀,搜索停止。
- 正则匹配:正则表达式,在配置文件中定义的顺序,匹配到一个结果,搜索停止;
- 默认匹配:如果第3条规则产生匹配的话,结果被使用。否则,如同从第2条规则被使用。
举例子
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ~ /documents/Abc {
[ configuration CC ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
location /images/ {
[ configuration F ]
}
location /images/abc {
[ configuration G ]
}
location ~ /images/abc/ {
[ configuration H ]
}
location ~* /js/.*/\.js
按照上面的location写法,以下的匹配示例成立:
- / -> config A:精确完全匹配,即使/index.html也匹配不了
- /downloads/download.html -> config B:匹配B以后,往下没有任何匹配,采用B
- /images/1.gif -> configuration D:匹配到F,往下匹配到D,停止往下
- /images/abc/def -> config D:最长匹配到G,往下匹配D,停止往下你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序
- /documents/document.html -> config C:匹配到C,往下没有任何匹配,采用C
- /documents/1.jpg -> configuration E:匹配到C,往下正则匹配到E
- /documents/Abc.jpg -> config CC:最长匹配到C,往下正则顺序匹配到CC,不会往下到E
调试方法
server {
error_log logs/error.log;
location /admin/ {
error_log logs/admin-error.log debug; ## 注意级别, 单独文件
}
}
参考
Nginx 系列:Nginx 实践,location 路径匹配
|