Location 知识
Location是快速定位资源的,平时默认都是在根目录下面,我们可以通过配置Location指令块,来决定客户端发过来的请求URI如何处理。(location是根据Uri来进行不同的定位,location可以把网站的不同部分,定位到不同的处理方式上)
语法
location [=|~|~*|^~] patt { } //中括号中为修饰符,可以不写任何参数,此时称为一般匹配,也可以写参数
因此,大类型可以分为四种:
location = patt {} [精准匹配]
location ^~patt{} [忽略正则匹配]
location ~ patt{} [正则匹配]
location patt{} [普通匹配]
location 配置可以有两种配置方法,可以在server指令块和location指令块配置。
1、修饰符(= ~ ~* ^~ @) + uri(资源路径)
2、@ + name
修饰符
= :精确匹配(必须全部相等)
~ :大小写敏感(正则表达式)
~* :忽略大小写(正则表达式),这里要注意忽略大小写的意思是请求的字符大小写都可以,
但是不会进行大小转换,请求的大小写对应的文件必须存在。
^~ :只需匹配uri部分
@ :内部服务跳转
精确匹配
默认是/,即所有的资源都跑到/下面去找,这样速度比较慢,可以直接定位location=/ location / {
[…]
}
location = /abcd {
[…]
}
http://website.com/abcd匹配,其他的如http://website.com/abcd/,http://website.com/abcde都是不匹配的会返回404
区分大小写
下面使用echo模块来测试,测试一下匹配到哪个location,location里面的jpg资源是可以不存在的,即使用echo打印看调用哪个模块
location ~/jfedu.jpg {
echo "this is ~/jfedu.jpg";
}
location ~/JFEDU.jgp {
echo "this is ~/JFEDU.jpg";
}
[root@www ~]# curl 192.168.179.99/jfedu.jpg
this is ~/jfedu.jpg
[root@www ~]# curl 192.168.179.99/JFEDU.jgp
this is ~/JFEDU.jpg
可以看到是区分大小写的,大小写不一样匹配到的location是不一样的
不区分大小写
location ~* /jfedu.jpg {
echo "this is ~/jfedu.jpg";
}
[root@www ~]# curl 192.168.179.99/jfedu.jpg
this is ~/jfedu.jpg
[root@www ~]# curl 192.168.179.99/JFEDU.jpg
this is ~/jfedu.jpg
[root@www ~]# curl 192.168.179.99/jfedu.JPG
this is ~/jfedu.jpg
这样写一个location就行了,不用像上面大小写敏感写两个location。
下面防盗链也使用了不区分大小写
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked lutixia.net *.jfedu.net;
root /usr/share/nginx/html;
if ($invalid_referer) {
return 403;
}}
”@” nginx内部跳转
location /img/ {
error_page 404 @img_err;
}
location @img_err {
}
以 /img/ 开头的请求,如果链接的状态为 404。则会匹配到 @img_err 这条规则上
忽略正则匹配
^~,只匹配以 uri 开头,匹配成功以后,会停止搜索后面的正则表达式匹配
location ^~/img/{
echo "this is img";
}
只要uri以/img/ 开头的请求,都会匹配上,不管后面是什么类型的资源
[root@www ~]# curl 192.168.179.99/img/
this is img
[root@www ~]# curl 192.168.179.99/img/abc
this is img
优先级问题
(1)
location ~* /img/jfedu.jpg {
echo "this is ~*/jfedu.jpg";
}
location ~ /img/jfedu.jpg {
echo "this is ~jfedu.jpg";
}
location = /img/JFEDU.jpg {
echo "this is =/JFEDU.jpg";
}
location ^~/img/{
echo "this is ^~/img/";
}
[root@www ~]# curl 192.168.179.99/img/JFEDU.jpg --可以看到先匹配到的是精准匹配,正则和忽略正则优先级都没精准高
this is =/JFEDU.jpg
(2)
location ~* /img/jfedu.jpg {
echo "this is ~*/jfedu.jpg";
}
location ~ /img/jfedu.jpg {
echo "this is ~jfedu.jpg";
}
location ^~/img/{
echo "this is ^~/img/";
}
这里就剩下正则匹配和忽略正则匹配
[root@www ~]# curl 192.168.179.99/img/jfedu.jpg --可以看到先匹配到的是忽略正则,忽略正则优先级比正则要高
this is ^~/img/
(3)
location ~* /img/jfedu.jpg {
echo "this is ~*/jfedu.jpg";
}
location ~ /img/jfedu.jpg {
echo "this is ~jfedu.jpg";
}
[root@www ~]# curl 192.168.179.99/img/jfedu.jpg --可以看到正则之内优先级和顺序有关
this is ~*/jfedu.jpg
location命中过程:
1.先进行精准匹配,如果命中立即返回结果并结束解析的过程;
2.精准匹配未命中判断普通匹配,如果命中多个会记录下"最长的"命中结果,但不会结束解析;
3.继续判断正则匹配,按照正则匹配设置的规则正则表达式进行匹配,如果有多个正则匹配则由上到下进行匹配,一旦匹配成功一个会立即返回结果并结束解析.
ps:普通匹配的前后顺序是无所谓的,因为记录的是最长的结果,而正则匹配是按从上到下匹配的,这个需要注意!!!
优先级 精准匹配>非正则匹配>正则匹配由上到下>普通匹配