本文的配置文件: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)中记忆了普通匹配的结果,则返回它,如果没有则匹配失败。

nginx匹配认证 nginx 地址匹配_文件名

三、pattern == 文件名? pattern==目录名

(1) pattern == 文件名

URI:192.168.122.1/文件名,如果URI中pattern是相匹配的一个文件名 结论:
  ① [ 文件名 必须在 index行中 出现 (如果在index行中不出现,则请求的资源得不到) ]
  ② 访问的资源 = root/文件名

nginx匹配认证 nginx 地址匹配_nginx匹配认证_02


以上图为例:

  (1) 文件名 = test.html,因此index行中必须存在test.html

  (2) 访问的结果:root/文件名 = /data/html/test.html

(2) pattern==目录名

URI中pattern是一个目录 结论:

  ① 访问的目录变成root/pattern

  ② 访问的资源 = root/目录名/index行中的匹配的文件

nginx匹配认证 nginx 地址匹配_nginx匹配认证_03


以上图为例:

  (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 != 空 ] 时,举例分析:

nginx匹配认证 nginx 地址匹配_html_04

在浏览器中输入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页面。

nginx匹配认证 nginx 地址匹配_文件名_05


注解:

  (1) pattern和index中的/test.html必须同名字

  (2) root不能省略,省略后root=/usr/local/nginx/html

② 当URI的 [ pattern == / && pattern == 空 ] 时,举例分析:

nginx匹配认证 nginx 地址匹配_文件名_06


在浏览器输入 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资源并显示到浏览器上,如图:

nginx匹配认证 nginx 地址匹配_nginx匹配认证_07

(3) 正则匹配

语法格式:location ~ pattern {}

注意:pattern前面必须加上 ~ 符号,表示区分大小的正则匹配。~*表示不区分大小。

nginx匹配认证 nginx 地址匹配_nginx匹配认证_08


输入URI = http://192.168.122.1/image/,则~ image是正则匹配,匹配成功。将会访问/data/image/cat.jpg资源,访问成功,见下图:

nginx匹配认证 nginx 地址匹配_正则匹配_09