nginx之[server_name]与[location]详解

1 server_name 详解⭐⭐

  • 每个server定义一个server_name
  • 每个server_name可以指定一个或多个域名
1 匹配规则

nginx之[server_name]与[location]详解_第1张图片

=

2 配置范例
# 左匹配
server {
 listen 80;
 server_name *.nginx-test.com;
 root /usr/share/nginx/html/nginx-test/left-match/;
 location / {
  index index.html;
 }
}

# 正则匹配
server {
 listen 80;
 server_name ~^.*\.nginx-test\..*$;
 root /usr/share/nginx/html/nginx-test/reg-match/;
 location / {
  index index.html;
 }
}

# 右匹配
server {
 listen 80;
 server_name www.nginx-test.*;
 root /usr/share/nginx/html/nginx-test/right-match/;
 location / {
  index index.html;
 }
}

# 完全匹配
server {
 listen 80;
 server_name www.nginx-test.com;
 root /usr/share/nginx/html/nginx-test/all-match/;
 location / {
  index index.html;
 }
}

=

3 访问分析
当访问 www.nginx-test.com 时,都可以被匹配上,因此选择优先级最高的“完全匹配”;
当访问 mail.nginx-test.com 时,会进行“左匹配”;
当访问 www.nginx-test.org 时,会进行“右匹配”;
当访问 doc.nginx-test.com 时,会进行“左匹配”;
当访问 www.nginx-test.cn 时,会进行“右匹配”;
当访问 fe.nginx-test.club 时,会进行“正则匹配”;

=

=

2 location 详解⭐⭐

在一个server中location配置段可存在多个,用于实现从URI到文件系统的路径映射ngnix会根据用户请求的URI逐个检查配置文件中定义的所有location,按一定的优化级找出一个最佳匹配,而后应用其配置

=

匹配规则

nginx之[server_name]与[location]详解_第2张图片

=

语法规则
# 根据用户请求的URI进行匹配:
location [ = | ~ | ~* | ^~ ] uri { ... }

=   # 用于标准uri前,需要请求字串与uri【精确匹配】,大小敏感,如果匹配成功就停止向下匹配 并立即处理请求

^~  # 用于标准uri前
    # 匹配以指定的正则表达式开头的URI
    # 不区分字符大小写
    
~   # 用于标准uri前,
    # 表示【包含】正则表达式。并且区分大小写
~*  # 用于标准uri前,
    # 表示【包含】正则表达式。并且不区分大小写

不带符号 # 匹配使用以此URI开头的URI

\       # 用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号

#》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

# 拿到一个具体的 URI 之后,思考顺序:
1.哪几个 location 能够匹配
2.在匹配的多个 location 中,哪个的优先级最高
#——————————————————————————————————————————————————————————————————————————

# 官方范例:
location = / {
 	[ configuration A ]
}

location / {
	[ configuration B ]
}

location /documents/ {
 	[ configuration C ]
}

location ^~ /images/ {
 	[ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
 	[ configuration E ]
}

# 效果:
The "/" request will match configuration A	# 存疑!!!
the "/index.html" request will match configuration B
the "/documents/document.html" request will match configuration C
the "/images/1.gif" request will match configuration D
the "/documents/1.jpg" request will match configuration E

=

1 匹配案例-精确匹配

精确匹配一般用于匹配组织的logo等相对固定的URL,匹配优先级最高

# 修改配置
[root@CentOS8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
'具体配置的每一行都必须以分号结尾。。。。
server {
    listen 80;
    server_name www.magedu.org;
    location / {
        root  /data/nginx/html/pc;
    }
    location /logo.jpg {
        root /data/nginx/images;
        index index.html;
    }
}

# 将图片文件传到/data/nginx/images,并修改文件名为logo.jpg
[root@CentOS8 ~]# mkdir /data/nginx/images
[root@CentOS8 ~]# mv logo.jpg /data/nginx/images
[root@CentOS8 ~]# ls /data/nginx/images
logo.jpg

# 重载
nginx -s reload

# 测试
Windows宿主机使用管理员身份运行编辑器,修改 hosts文件添加解析记录(取消hosts文件的只读权限)

浏览器访问:http://www.magedu.org/logo.jpg

nginx之[server_name]与[location]详解_第3张图片


2 匹配案例-区分大小写

~实现区分大小写的模糊匹配

# 修改配置
[root@CentOS8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
    listen 80;
    server_name www.magedu.org;
    location / {
        root /data/nginx/html/pc;
        }
    location ~ /L.?\.jpg {		# 匹配字母L开头的jpg图片。。。
    						  # . 是任意单个字符,? 是次数匹配,\ 是转义后面的 .
        root /data/nginx/images;
        index index.html;
        }
}

# 重载
nginx -s reload

# 浏览器访问(下图一)
http://www.magedu.org/logo.jpg
'图片文件名为 logo.jpg ,大小写敏感,因此匹配失败。。。

# 修改文件名再次访问
'注意配置中使用的是【/L.?\.jpg】,因此文件名L后最多再接一个字符,下面改名为LL
[root@CentOS8 ~]# cd /data/nginx/images/
[root@CentOS8 images]# mv logo.jpg LL.jpg
[root@CentOS8 images]# ls
Logo.jpg
# 重载
nginx -s reload

# 再次访问(下图二)
http://www.magedu.org/LL.jpg	# 注意指定的URI

nginx之[server_name]与[location]详解_第4张图片

nginx之[server_name]与[location]详解_第5张图片


3 匹配案例-不区分大小写

~*用来对用户请求的uri做模糊匹配,无论URI中都是大写、都是小写或者大小写混合,此模式都会匹配
通常使用此模式匹配用户请求中的静态资源并继续做下一步操作,此方式使用较多

注意: 此方式中,对于Linux文件系统上的文件仍然是区分大小写的。如果磁盘文件不存在,仍会提示404
只是匹配的范围变大了!!!但是还是要根据用户的URI来匹配磁盘的对应文件

# 修改配置
[root@CentOS8 images]# cat /apps/nginx/conf/conf.d/pc.conf
server {
    listen 80;
    server_name www.magedu.org;
    location / {
        root /data/nginx/html/pc;
        }
    location ~* /L.+\.jpg {		# 注意次数匹配,本次限定文件名至少2个字符
        root /data/nginx/images;
        index index.html;
        }
}

# 修改文件名
[root@CentOS8 images]# ls
LL.jpg  logo.jpg

# 重载

# 访问(准确文件名)
http://www.magedu.org/logo.jpg
http://www.magedu.org/LL.jpg

# 访问(大小写不匹配)
'访问失败404,是因为nginx服务器的资源目录没有有相应的文件。。。
http://www.magedu.org/LOgo.jpg
http://www.magedu.org/ll.jpg

# 加入图片文件 LOgo.jpg、ll.jpg 再次访问
[root@CentOS8 images]# ls
ll.jpg  LL.jpg  logo.jpg  LOgo.jpg
# 访问
http://www.magedu.org/LOgo.jpg
http://www.magedu.org/ll.jpg

nginx之[server_name]与[location]详解_第6张图片


nginx之[server_name]与[location]详解_第7张图片


nginx之[server_name]与[location]详解_第8张图片


⚡大小写详解

无论大小写是否敏感,这是服务器的配置。。。用户发起访问的URI必须是服务器上存在的文件

# 当配置内容为:
location ~* /L.+\.jpg
'表示匹配所有 L|l 开头的、文件名至少为2个字符 的jpg文件
'因此用户可以访问的目标资源范围变得更大

# 当前拥有的文件
[root@CentOS8 images]# ls
ll.jpg  LL.jpg  logo.jpg  LOgo.jpg

# 用户访问:
'原则:用户发起访问的 URI 必须是服务器文件系统中存在的文件(精确匹配到)
因此此设置之下,用户可以访问的所有目标为:
http://www.magedu.org/logo.jpg
http://www.magedu.org/LL.jpg
http://www.magedu.org/LOgo.jpg
http://www.magedu.org/ll.jpg

# 而如果配置文件是 location ~ /L.+\.jpg
'那么服务器只会去匹配 L 开头的文件
此时用户只能访问:
http://www.magedu.org/LL.jpg
http://www.magedu.org/LOgo.jpg
'这就是大小写敏感对用户访问带来的区别。。。。。。。。。。

=

4 匹配案例-以指定URI开头
# 修改配置
[root@CentOS8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
    listen 80;
    server_name www.magedu.org;
    location ^~ /images {		'表示匹配以 /images 开头的 URI
        root /data/nginx/;
        index index.html;
        }
    location /api {
        alias /data/nginx/api;
        index index.html;
        }
}

# 补充目录,准备数据
[root@CentOS8 ~]# echo "caokunzi images" > /data/nginx/images/index.html

[root@CentOS8 ~]# mkdir /data/nginx/api
[root@CentOS8 ~]# echo "caokunzi api" > /data/nginx/api/index.html

# 重载
nginx -s reload

# 测试
[root@CentOS8 ~]# curl http://www.magedu.org/images/
caokunzi images
[root@CentOS8 ~]# curl http://www.magedu.org/api/
caokunzi api
#-------------------------------------------------------
# 解析
1.访问 /images/
只有第一个location匹配,自然是访问 images/index.html
2.访问 /api/
只有第二个location匹配,alias替换后,实际访问 /data/nginx/api/index.html

=

5 匹配案例-文件名后缀
# 修改配置
[root@CentOS8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
    listen 80;
    server_name www.magedu.org;
    location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js|css)$ {     '限定后缀以表示资源格式
        root /data/nginx/static;
        index index.html;
        }
}

# 准备文件
[root@CentOS8 ~]# ls /data/nginx/static
caokunzi.jpg

# 重载
nginx -s reload

# 访问
http://www.magedu.org/caokunzi.jpg

nginx之[server_name]与[location]详解_第9张图片


6 匹配案例-location优先级
# 修改配置
[root@CentOS8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
    listen 80;
    server_name www.magedu.org;
    location = /1.jpg {
        root /data/nginx/static1;
        index index.html;
    }
    location /1.jpg {
        root /data/nginx/static2;
        index index.html;
    }
    location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {
        root /data/nginx/static3;
        index index.html;
    }
}

# 准备数据
mkdir -p /data/nginx/static{1,2,3}

[root@CentOS8 ~]# tree /data/nginx/static*
/data/nginx/static
└── caokunzi.jpg
/data/nginx/static1
└── 1.jpg
/data/nginx/static2
└── 1.jpg
/data/nginx/static3
└── 1.jpg
'说明:3个目录下的图片统一使用文件名 1.jpg ,然后用户访问 1.jpg 测试哪个优先匹配
'为分辨实验结果,事先准备好3张不同的图片。。。在图片上做好对应123的标识。。。

# 重载
nginx -s reload

# 访问(下图一)
http://www.magedu.org/1.jpg
'结果 static1 优先匹配
因为 location1 使用了 '=' 精确匹配,因此优先级最高
#--------------------------------------------------

# 修改配置,删除location1
[root@CentOS8 ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
    listen 80;
    server_name www.magedu.org;
    location /1.jpg {
        root /data/nginx/static2;
        index index.html;
    }
    location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ {
        root /data/nginx/static3;
        index index.html;
    }
}
# 重载
nginx -s reload
# 访问(下图二)
http://www.magedu.org/1.jpg
'结果 static3 优先匹配
因为 '~*''/1.jpg(不使用符号)'的优先级更高

nginx之[server_name]与[location]详解_第10张图片


生产使用案例
# 直接匹配网站根会加速Nginx访问处理
location = /index.html {
 ......;
}
location / {
 ......;
}


# 静态资源配置方法1
location ^~ /static/ {
 ......;
}
# 静态资源配置方法2, 应用较多
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
 ......;
}


# 多应用配置
location ~* /app1 {
  ......;
}
location ~* /app2 {
  ......;
}

=

=

你可能感兴趣的:(nginx,nginx)