1. location作用
location指令的作用是可以根据用户请求的URI来执行不同的应用,其实就是根据用户请求的
网站地址URL匹配,匹配成功即进行相关的操作。
2. location语法
location使用的语法例子:
location [=|~|~*|^~] uri{
…
}
location语法列表说明
location | [=|~|~*|^~|@] | uri | {…} |
---|---|---|---|
指令 | 匹配标识 | 匹配的网站网址 | 匹配URI后要执行的配置段 |
上述语法中的URI部分是关键,这个URI可以是普通的字符串地址路径或者是正则表达式,当匹配成功则执行后面大括号里面的相关指令。正则表达式的签名还可以有^或~等特殊的字符。
这两种特殊字符~或~匹配的区别为:
● ~ 用于区分大小写(大小写敏感)的匹配;
● ~ 用于不区分大小写的匹配。还可以用逻辑操作符!(叹号)对上面的匹配取反,即!~和!~
● ^~ 作用是在常规的字符串匹配检查之后,不做正则表达式的检查,即如果最明确的那个字符串
匹配的location匹配中有此前缀,那么不做正则表达式的检查。
3. location匹配实例
下面是一组典型的location匹配,是官方的例子。
location = / {
[configuration A]
}
location / {
[configuration B]
}
location /documents/ {
[configuration C]
}
location ^~ /images/ {
[configuration D]
}
location ~*.(gif|jpg|jpeg)${
[configuration E]
}
在上述location配置中,用户请求对应匹配如下表:
用户请求的URI | 完整的URL地址 | 匹配的配置 |
---|---|---|
/ | http://www.linux.ac.cn/ | configuration A |
/index.html | http://www.linux.ac.cn/ | configuration B |
/documents/index.html | http://www.linux.ac.cn/documents/index.html | configuration C |
/images/1.gif | http://www.linux.ac.cn/images/1.gif | configuration D |
/documents/1.jpg | http://www.linux.ac.cn/documents/1.jpg | configuration E |
4. location实战
Nginx配置文件内容如下:
server {
listen 80;
server_name www.linux.ac.cn;
location / {<br /> return 401;<br /> }
location =/ {<br /> return 402;<br /> }
location /documents/ {<br /> return 403;<br /> }
location ^~/images/ {<br /> return 404;<br /> }
location ~*\.(gif|jpg|jpeg)$ {<br /> return 500;<br /> }
access_log logs/www_access.log main;
}<br />然后以linux客户端为例对上述location匹配进行真实测试,配置hosts文件如下。<br />[root@web01 web]# `tail -1 /etc/hosts`<br />10.0.0.8 www.linux.ac.cn<br /> **实验结果如下**:<br />[root@web01 web]# curl -s -o /dev/null -I -w "%{http_code}\n" [http://www.linux.ac.cn](http://www.linux.ac.cn)<br />402<br />[root@web01 web]# curl -s -o /dev/null -I -w "%{http_code}\n" [http://www.linux.ac.cn/](http://www.linux.ac.cn/)<br />402<br />[root@web01 web]# curl -s -o /dev/null -I -w "%{http_code}\n" [http://www.linux.ac.cn/index.html](http://www.linux.ac.cn/index.html)<br />401<br />[root@web01 web]# curl -s -o /dev/null -I -w "%{http_code}\n" [http://www.linux.ac.cn/documents/index.html](http://www.linux.ac.cn/documents/index.html)<br />403<br />[root@web01 web]# curl -s -o /dev/null -I -w "%{http_code}\n" [http://www.linux.ac.cn/documents/1.jpg](http://www.linux.ac.cn/documents/1.jpg)<br />500<br />[root@web01 web]# curl -s -o /dev/null -I -w "%{http_code}\n" [http://www.linux.ac.cn/images/1.gif](http://www.linux.ac.cn/images/1.gif)<br />404<br />[root@web01 web]# curl -s -o /dev/null -I -w "%{http_code}\n" [http://www.linux.ac.cn/kkk/1.gif](http://www.linux.ac.cn/kkk/1.gif)<br />500<br />[root@web01 web]# curl -s -o /dev/null -I -w "%{http_code}\n" [http://www.linux.ac.cn/index.html](http://www.linux.ac.cn/index.html)<br />401<br />[root@web01 web]# curl -s -o /dev/null -I -w "%{http_code}\n" [http://www.linux.ac.cn/kkk](http://www.linux.ac.cn/kkk)<br />401
用户请求说明:
用户请求的URI | 设置的状态码 | 说明 |
---|---|---|
当为空或者/的时候 | 返回402,即匹配了: location =/ { return 402; } |
=是精确匹配,优先级最高, 无论放置的顺序如何都将优先被匹配并执行。 |
当为/index.html或/kkk时 | 返回了401,即匹配了: location / { return 401; } |
/为默认匹配,即如果没有匹配上其它的location,则最后匹配“默认匹配”的部分。 |
当为/documents/index.html时 | 返回了403,即匹配了: location /documents/ { return 403; } |
此部分为路径匹配,即匹配了路径/documents/,注意后面的 /documents/1.jpg,没有匹配此处的location,而是匹配了结尾的1.jpg |
当为/documents/1.jpg时 | 返回了500,即匹配了: location ~*\.(gif|jpg|jpeg)$ { return 500; } |
此部分匹配了1.jpg,属于文件扩展名匹配,虽然有/documents/ 但还是匹配了扩展名。 |
当为/images/1.gif时 | 返回了404,即匹配了: location ^~/images/ { return 404; } |
此部分为路径匹配,但是前面增加了特殊字符~^,所以有些匹配了路径,而没有匹配结尾的1.gif |
当为/kkk/1.gif时 | 返回了500,即匹配了: location ~*\.(gif|jpg|jpeg)$ { return 500; } |
上述不用URI及特殊字符组合匹配的顺序说明
不用URI及特殊字符组合的匹配顺序 | 匹配说明 |
---|---|
第一名:location =/ { | 精确匹配/ |
第二名:location ^~/images/ { | 匹配常规字符串,不做正则匹配检查。 |
第三名:location ~*\.(gif|jpg|jpeg)$ { | 正则匹配 |
第四名:location /documents/ { | 匹配常规字符串,如果有正则则优先匹配正则 |
第五名:location / { | 所有location都不能匹配的时候默认匹配它 |