Nginx-路由匹配规则
Nginx localhost路由匹配规则
URI 即统一标识资源符,通用的 URI 语法格式如下:
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
格式说明如下:
- 在 Nginx 的应用场景中,URL 与 URI 并无明确区别。URI 标准(RFC3986)中约定,URL 是 URI 的一个子集;
- scheme 是 URI 请求时遵守的协议,常见的有 HTTP、HTTPS、FTP;
- host[:port] 是主机名与端口号,HTTP 协议的默认端口是 80,HTTPS 协议的默认端口是 443;
- [/path] 是访问路径与访问文件名;
- [?query] 是访问参数,访问参数以“?”开始作标识,由多个以“&”连接的 key=value 形式的字符串组成。
| 语法 | location [= | ~ | ~* | ^~ | @] pattern { ... } |
|---|---|
| 位置 | server,location |
其中,[=||*|^~|@]部分称为 location 修饰语(Modifier),修饰语定义了与 URI 的匹配方式。pattern 为匹配项,可以是字符串或正则表达式。
URI 匹配规则
uri变量是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式,那么nginx服务器在搜索匹配location的时候,是先使用不包含正则表达式进行匹配,找到一个匹配度最高的一个,然后在通过包含正则表达式的进行匹配,如果能匹配到直接访问,匹配不到,就使用刚才匹配度最高的那个location来处理请求。
无修饰语
:完全匹配 URI 中除访问参数以外的内容,匹配项的内容只能是字符串,不能是正则表达式,要求必须以指定模式开始;
server {
listen 80;
server_name localhost;
location /abc {
default_type text/plain;
return 200 "access success";
}
}
以下访问:只要以abc开始就可以匹配,?后的都是访问参数
http://192.168.204.131/abc/def
http://192.168.204.131/abc?p1=TOM
http://192.168.204.131/abc/
http://192.168.204.131/abcdef
修饰语"="
:完全匹配 URI 中除访问参数以外的内容,Linux 系统下会区分大小写,Windows 系统下则不会。
server {
listen 80;
server_name localhost;
location =/abc {
default_type text/plain;
return 200 "修饰语 = success";
}
}
以下访问:只能完全匹配abc. ?后的都是访问参数
#可以匹配
http://192.168.204.131/abc
http://192.168.204.131/abc?p1=TOM
#匹配不到
http://192.168.204.131/abc/
http://192.168.204.131/abcdef
http://192.168.204.131/abc/def
修饰语"~"
:完全匹配 URI 中除访问参数以外的内容,Linux 系统下会区分大小写,Windows 系统下不会。匹配项的内容必须是正则表达式。~ 区分大小写,~* 不区分大小写
server {
listen 80;
server_name localhost;
location ~ ^/abc\w*$ {
default_type text/plain;
return 200 "修饰语 ~ success";
}
}
server {
listen 80;
server_name localhost;
location ~* ^/abc\w*$ {
default_type text/plain;
return 200 "修饰语 ~* success";
}
}
以下访问:
#可以匹配 \w* 表示abc后可以有单词,出现{0,}
http://192.168.204.131/abc
http://192.168.204.131/abc/efg
http://192.168.204.131/abcd?p1=TOM
http://192.168.204.131/abcd/efg?p1=TOM
修饰语"^~"
:完全匹配 URI 中除访问参数以外的内容,匹配项的内容如果不是正则表达式,则不再进行正则表达式测试。
server {
listen 80;
server_name localhost;
location ^~ /abc {
default_type text/plain;
return 200 "修饰语 ^~ success";
}
}
修饰语"@"
:定义一个只能内部访问的 location 区域,可以被其他内部跳转指令使用,如 try_files 或 error_page。
匹配顺序
- 先检测匹配项的内容为非正则表达式修饰语的 location,然后再检测匹配项的内容为正则表达式修饰语的 location。
- 匹配项的内容为正则与非正则都匹配的 location,按照匹配项的内容为正则匹配的 location 执行。
- 所有匹配项的内容均为非正则表达式的 location,按照匹配项的内容完全匹配的内容长短进行匹配,即匹配内容多的 location 被执行。
- 所有匹配项的内容均为正则表达式的 location,按照书写的先后顺序进行匹配,匹配后就执行,不再做后续检测。