每一个虚拟主机或是代理服都需要定义一个location,用以在用户端查询时提供搜索,当匹配到合适的location时,转向所需的应用。location可以使用正则来查询匹配,也可以否定匹配,location只针对定义内容进行优先级匹配,并且在查询到匹配后忽略其它匹配选项。以下将对可能遇到的一些location进行说明:
- location匹配符
- 等于匹配符"=",为精确匹配,不支持正则匹配
- 空匹配符,匹配以指定模式开始的URI,不支持正则匹配
- 正则匹配符"~",这里包括了三种,以"~"开始的区分大小写的匹配,以"~*"开始的不区分大小写的匹配,以"^~"开始的以指定模式开始的正则匹配
- 内部访问符"@",一般用于错误页面等
匹配符优先级
- =
- 空匹配符,满足精确匹配时
- ^~
- ~或~*
- 空匹配符
举例说明upstream tomcats {
server 192.168.100.101:80 max_fails=0 fail_timeout=5s;
server 192.168.100.102:80 max_fails=0 fail_timeout=5s;
}
server {
listen 80;
server_name www.xxx.com;
#1. 空匹配符时,最后生效,与配置先后并无关联
location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_pass http://tomcats;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
#2.实际匹配为"www.xxx.com/showlist/",但优先级低于"="号
location ~ /showlist {
root /data/html;
index index.html index.htm;
}#3.最先查询匹配
location = /pages {
root /data/html;
index index.html index.htm;
}
#4.以指定模式进行匹配
location ^~ /file/ {
return 404;
}
#5.等同于"#2"的效果,但匹配内容为以".jpg"结尾的查询
location ~* \.jpg$ {
root /data/img;
}
#6.在执行动态资源请求时,直接转向后端服务器,因为使用了"~*",它优先于第一条规则生效 location ~ .*\.(jsp|do)?$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_pass http://tomcats;
proxy_next_upstream http_502 http_504 error timeout invalid_header;
}
#7.精确匹配
location /50x.html {
root /data/html;
}
由以上配置进行测试后可以得出以下匹配优先级结论:
(location =) > (location 完整路径 >) >(location ^~ 路径) >(location ~* 正则) >(location 路径)