本文的配置文件:vim /usr/local/nginx/conf/nginx.conf
在浏览器输入URI后,Nginx会对URI / pattern
进行”匹配“,”匹配“成功即将进行相关的操作。这时就会使用到location。
简单归结于一句话:location就是用于URI / pattern
解析的。
举例说明:192.168.88.9/image/cat.html 哪个是URI / pattern?
192.168.88.9是域名地址
URI / pattern = /image/cat.html。 location匹配的是/image/cat.html,不包括198.168.88.9
一、location
的基本语法格式
location的语法: location [ = | ~ | ~* | ^~ | @ ] pattern { … }
因此,大类型可以分为三种:
精准匹配 location = pattern {}
普通匹配 location pattern {}
正则匹配 location ~ pattern {}
二、匹配流程图
流程图解释:
(1) 如果精准匹配成功,则返回精准匹配的结果
(2) 精准匹配不成功,进行普通匹配(以匹配字符串最长的作为匹配结果),如果普通匹配成功就记忆匹配的结果
(3) 进行正则匹配,如果任何一个正则匹配成功,则返回;如果不成功,则如果(2)中记忆了普通匹配的结果,则返回它,如果没有则匹配失败。
三、pattern == 文件名
? pattern==目录名
(1) pattern == 文件名
URI:192.168.122.1/文件名,如果URI中pattern是相匹配的一个文件名
结论:
① [ 文件名
必须在 index行中
出现 (如果在index行中不出现,则请求的资源得不到) ]
② 访问的资源 = root/文件名
以上图为例:
(1) 文件名
= test.html,因此index行中必须存在test.html
(2) 访问的结果:root/文件名 = /data/html/test.html
(2) pattern==目录名
URI中pattern是一个目录
结论:
① 访问的目录变成root/pattern
② 访问的资源 = root/目录名/index行中的匹配的文件
以上图为例:
(1) 访问的目录变成root/pattern = /data/image/foo
(2) 访问的资源 = /data/image/foo/index行中的匹配的文件,即依次匹配 /data/image/foo/cat.jpg、/data/image/foo/index.htm、/data/image/foo/index.html。
四、三类匹配
(1) 普通
匹配
语法格式:location pattern {}
注解:普通匹配pattern之前没有符号。
(2) 精准
匹配
精准匹配根据URI分为两种情况:非常重要的难点
① 当URI的 [ pattern != /
&& pattern != 空
] 时,举例分析:
在浏览器中输入192.168.122.1/test.html,因为输入的URI的 [ pattern != / && pattern != 空 ] ,即/test.html(非空),所以location过程是:①精准匹配到/test.html ②去index查找有没有test.html,查找成功 ③返回/data/html/test.html对应的页面
总结:因为搜索的URI是非空的,因此不会发生”内部跳转“,有页面就返回页面,没有页面就返回404 Not Found页面。
注解:
(1) pattern和index中的/test.html必须同名字
(2) root不能省略,省略后root=/usr/local/nginx/html
② 当URI的 [ pattern == /
&& pattern == 空
] 时,举例分析:
在浏览器输入 192.168.122.1 或 192.168.122.1/ 后,location执行过程分析:
(1) 192.168.122.1 或 192.168.122.1/ 是等价的,它们的 pattern = /,所以将与图中的①发生精准匹配
(2) 发生精准匹配后,将进入①中的{ },执行到index cat.jpg,此时就是特别之处:pattern转变成 /cat.jpg ⇒ ⇒ ⇒ 就相当于在浏览器中输入了192.168.122.1/cat.jpg,pattern=/cat.jpg
(3) 会重新进行location过程,再次精准匹配①,发现 /cat.jpg 与 / 不匹配
(4) 转而去精准匹配②,发现匹配成功,就会从index中查找是否有cat.jpg ⇒ 发现index中有cat.jpg,就获得/data/html/cat.jpg资源并显示到浏览器上,如图:
(3) 正则
匹配
语法格式:location ~ pattern {}
注意:pattern前面必须加上 ~ 符号,表示区分大小的正则匹配。~*表示不区分大小。
输入URI = http://192.168.122.1/image/,则~ image是正则匹配,匹配成功。将会访问/data/image/cat.jpg资源,访问成功,见下图: