一、Location语法

Location区块的作用:根据用户请求的网站的URL进行匹配,若某一Location区块匹配成功则执行Location区块中定义的一系列操作。

location的语法:

location [ = | ~ | ~* | ^~ ] uri{
...
}

= :表示精确匹配后面的内容

^~ :表示最大前缀匹配

~ :用于区分大小写的匹配

~*:用于不区分大小写的匹配

优先级:  =  高于  ^~  高于  ~*  高于 ~

注:

!(取反)搭配使用

没有顺序关系,不是说谁在前面,就先匹配谁;匹配要参照优先级进行匹配。

 

生产环境中常用的几条规则:
(1)location =/ {
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理.
}

(2)location ~ . * \.(jpg|jpeg|css|js)$ {
# 匹配大小写有关以.jpg .jpeg .css .js 等结尾,至少以一个字符开头的文件
# \. 转义点为.的原意,$ 代表以什么固定结尾," . "小数点代表任意一个字符," * "星号代表匹配任意多个任意字符
}

 

二、Location匹配实战

        接下来我们通过下面的测试来验证不同的location标签生效的顺序

1、修改了配置文件,echo 命令测试 "/" "= /test.png" "/test.png" 两个优先级,谁更优先?

location / {
 echo "haha";
 }
 location /test.png {
 echo "xixi";
 }
 location = /test.png {
 echo "heihei";
 } # 测试:
 [root@jfedu conf]# curl  www.jf1.com    # 匹配 "/"
 haha
 [root@jfedu conf]# curl  www.jf1.com/
 haha
 [root@jfedu conf]# curl  www.jf1.com/test.png    # 精确匹配
 heihei
 [root@jfedu conf]# curl www.jf1.com/test     # 匹配 "/",匹配字符没有匹配到,默认有/ 托底。如果没有echo 模块,这个访问url 就
 haha                                                                    会报错 404 ,没有找到这个文件。

 

2、修改了配置文件,echo 命令测试 "^~ /test/" "^~ /test" 两个优先级,谁更优先?

location ^~ /test/ {
 echo "jfedu3";
 }
 location ^~ /test {
 echo "jfedu4";
 }
 # 测试
 [root@jfedu conf]# curl www.jf1.com/test #最大前缀匹配testjfedu4
 [root@jfedu conf]# curl www.jf1.com/test666 #最大前缀匹配test666
 jfedu4
 [root@jfedu conf]# curl www.jf1.com/test666777
 jfedu4
 [root@jfedu conf]# curl www.jf1.com/test/ #匹配目录
 jfedu3 [root@jfedu conf]# curl www.jf1.com/test123/ #最大前缀匹配test
 jfedu4

#上面这个大家可能会有疑问,大家可能会这样想:测试的这是目录,选取最大前缀应该输出jfedu3才对,因为只有输出jfedu3那个才是匹配目录

释疑:其实因为用户的需求是访问test123这个目录,因为输出jfedu3,已经确定最大前缀也只是test目录,test123和test完全不相同,所以它就去匹配下面jfedu4这个最大前缀,因为jfedu4的test后面是未知,它有可能到此为止是一个文件,也有可能后面再加一堆参数,再加一个斜杠变目录,说白了:输出的jfedu3的那个location已经确定它不可能是目录test123,然而输出jfedu4的那个location还有可能是目录test123。所以输出jfedu4。

[root@jfedu conf]# curl www.jf1.com/test/123 #匹配目录test里面的文件
 jfedu3
 # 匹配"^~ /test/" "^~ /test" ,"^~ /test/" 匹配目录使用,"^~ /test" 主要匹配文件,和文件名前缀匹配 3、修改了配置文件,echo 命令测试 "~" "~*" 两个优先级,谁更优先?
location ~ /test {
 echo "jfedu5";
 }
 location ~* /Test {
 echo "jfedu6";
 }
 # 测试
 [root@jfedu conf]# curl www.jf1.com/test #大小写相关
 jfedu5
 [root@jfedu conf]# curl www.jf1.com/tesT #大小写无关
 jfedu6


# 如果 "~" "~*" 在配置文件中执行功能是相同的,那么匹配顺序会按照配置中配置的先后顺序进行匹配。