每一个虚拟主机或是代理服都需要定义一个location,用以在用户端查询时提供搜索,当匹配到合适的location时,转向所需的应用。location可以使用正则来查询匹配,也可以否定匹配,location只针对定义内容进行优先级匹配,并且在查询到匹配后忽略其它匹配选项。以下将对可能遇到的一些location进行说明:

  • location匹配符

  1. 等于匹配符"=",为精确匹配,不支持正则匹配

  2. 空匹配符,匹配以指定模式开始的URI,不支持正则匹配

  3. 正则匹配符"~",这里包括了三种,以"~"开始的区分大小写的匹配,以"~*"开始的不区分大小写的匹配,以"^~"开始的以指定模式开始的正则匹配

  4. 内部访问符"@",一般用于错误页面等

匹配符优先级

  1. =

  2. 空匹配符,满足精确匹配时

  3. ^~

  4. ~或~*

  5. 空匹配符

举例说明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 路径)