学习这件事不在乎有没有人教你,最重要的是在于你自己有没有觉悟和恒心。————法布尔

编程

Nginx 中 Location语法笔记整理

  • 2020-03-09 23:21
简介 :当年看燕十八的直播课视频学习,并实践处理之后做的笔记(当初笔记本手写的)。整理下当初的笔记跟常见问题分析。location 定位的意思, 根据访问地址来进行不同的定位 。

[TOC]

location 概念

location 根据当前uri进行匹配路由 , 可以配置多个location也即是虚拟机(虚拟域名),location匹配的顺序是:先匹配 = 其次匹配^~再就是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。如果没有则按照nginx默认配置进行匹配结果。location匹配最终是请求一个文件,而非目录,如果匹配的是目录,那么他将查找index选项,并带着index选项再次匹配。

location 规则语法

  • location [ = | ~ | ~* | ^~ ] patt {
  • }
  • # []中间的模式可以不写,就默认是通用匹配。如果配置的路由404,可以打开nginx对应server下的error_log
  • #nginx允许每个虚拟机设置各自的访问日志跟错误日志。

location 规则概念

= 表示精确匹配,这个优先级也是最高的.

^~ 表示uri以某个常规字符串开头,理解为匹配url路径。

~ 表示区分大小写的正则匹配.

~* 表示不区分大小写的正则匹配(和上面的唯一区别就是大小写)

!~!~*分别为区分大小写不匹配及不区分大小写不匹配的正则

/ 通用匹配,任何请求都会匹配到,默认匹配.

如果以上都不匹配,那么nginx将会走默认配置, 如果默认都没找到,那么就会404.

= 精准匹配问题实践

记录下当时燕十八在直播课上出现的经典问题:

  • # 配置一
  • server {
  • listen 80;
  • server_name c.com;
  • index no;
  • # 精准匹配
  • location = / {
  • root /home/project/demo; # 根目录中都有个 index.html 文件
  • index index.htm index.html; # 这个地方注意是index.htm 开头
  • }
  • # 通用匹配
  • location / {
  • root /home/project/some; # 根目录中都有个 index.html 文件
  • index index.html;
  • }
  • access_log /home/wwwlogs/some_access.log;
  • error_log /home/wwwlogs/some_error.log;
  • }

针对配置一分析:

打开浏览器访问c.com/(本地虚拟机)结果出现了404 Not Found ,后面 / 不匹配到了精准location吗?怎么还会出现404? 当时燕十八直播课层层分析,找到了原因:

其实,精准匹配是生效了的,既然生效了, 为啥找不到页面?

打开错误日志: tail -f /home/wwwlogs/some_error.log 如下错误信息:

  • 2020/03/09 22:02:07 [error] 2519#0: *28 open() "/home/project/some/index.htm" failed
  • (2: No such file or directory), client: 192.168.33.1, server: c.com, request: "GET / HTTP/1.1", host: "c.com"

发现当前请求的uri竟然是/home/project/some/index.htm找通用匹配下的index.htm文件,而并不是/home/project/demo/index.htm,然后在通用匹配的根目录中新建index.htm再次访问,发现出现了刚才创建的index.htm文件信息。

原因就是:

当访问c.com/的时候路由找的是查找精准匹配并请求/index.htm,只加/或不加的时候默认找index配置的文件信息,因为nginx最终是要访问一个文件,而不是个目录。所以,此时uri/index.htm 或者 /index.html , 然后nginx将此uri上下文信息做内部转发,再次匹配location 精准匹配匹配不上了,因为此时uri/index.htm,所有,只能匹配到通用匹配,而刚开始通用匹配根目录并没有index.htm文件所以返回了404.

这时燕十八高逼格的说:“你们是不是以为,老子在强行解释?那咱们来验证下,老子绝非吹NB”(课里没这话哈~)。

然后,试着改了点东西。 将精准匹配改为:

  • # 精准匹配
  • location = /index.htm {
  • root /home/project/demo; # 新建个index.htm
  • index index.htm index.html;
  • }
  • # 通用匹配
  • location /index.htm {
  • root /home/project/some;
  • index index.htm index.html;
  • }

保存配置重启nginx访问c.com/index.htm直接命中精准匹配。

正则匹配

夜深了,刷牙睡觉。。。。

Top