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;

  1. location / {<br /> return 401;<br /> }
  2. location =/ {<br /> return 402;<br /> }
  3. location /documents/ {<br /> return 403;<br /> }
  4. location ^~/images/ {<br /> return 404;<br /> }
  5. location ~*\.(gif|jpg|jpeg)$ {<br /> return 500;<br /> }
  6. access_log logs/www_access.log main;
  7. }<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都不能匹配的时候默认匹配它