WEB服务与NGINX(6)-location使用详解


目录


1. location的详细用法

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

用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置。

uri前符号说明

  • = 对URI做精确匹配;
  • ^~对URI的最左边部分做匹配检查,不区分字符大小写
  • ~对URI做正则表达式模式匹配,区分字符大小写
  • !~ 对URI做正则表达式模式不匹配,区分字符大小写
  • ~*对URI做正则表达式模式匹配,不区分字符大小写
  • 不带符号匹配起始于此uri的所有的uri
  • / 通用匹配。任何请求都会匹配到
  • * 表示任意长度的任意字符

匹配优先级从高到低如下:

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~/~* 路径) > (location 部分起始路径) > (/)

1.1 精确匹配

#示例:精确匹配doc目录下的一个文件名。
#1.nginx的配置文件如下:
[root@nginx01 web1]# vim /etc/nginx/conf.d/virtualhost.conf 
server {
	listen 80;
	server_name www.nginx01.com;
	location / {
		root /data/nginx/html/web1;
		index index.html;
	}
	location = /file1.txt {
		root /data/nginx/html/web1/doc;
		index index.html;
	}
}

#2.重启nginx服务
[root@nginx01 web1]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@nginx01 web1]# systemctl reload nginx.service 

#3.新建doc目录和file1.txt文件
[root@nginx01 web1]# mkdir doc
[root@nginx01 web1]# echo "abc" > doc/file1.txt

#4.客户端测试
[root@xuzhichao ~]# curl http://www.nginx01.com/file1.txt
abc

1.2 区分大小写

#1.nginx的配置如下:
[root@nginx01 web1]# vim /etc/nginx/conf.d/virtualhost.conf 
server {
	listen 80;
	server_name www.nginx01.com;
	location / {
		root /data/nginx/html/web1;
		index index.html;
	}
	location ~ /file1\.txt {
		root /data/nginx/html/web1/doc;
		index index.html;
	}
}

#2.重启nginx服务
[root@nginx01 web1]# systemctl reload nginx.service

#3.在doc下新建文件
[root@nginx01 web1]# echo "qwe" > doc/file1.TXT
[root@nginx01 web1]# tree doc/
doc/
├── file1.txt
└── file1.TXT

#4.客户端如果访问File1.txt或file.TXT,则无法匹配到location ~ /file1.txt语句块
[root@xuzhichao ~]# curl http://www.nginx01.com/file1.txt
abc
[root@xuzhichao ~]# curl http://www.nginx01.com/file1.TXT
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>

1.3 不区分大小写

对用户的请求的uri做模糊匹配,不区分大小写,无论是大写,小写还是大小写混合都会匹配,但是需要有对应的资源(大写,小写,大小写混合)才能访问成功。此模式通常用于匹配用户的静态资源。

#1.nginx的配置文件如下:
root@nginx01 web1]# vim /etc/nginx/conf.d/virtualhost.conf
server {
	listen 80;
	server_name www.nginx01.com;
	location / {
		root /data/nginx/html/web1;
		index index.html;
	}
	location ~* /file1\.txt {
		root /data/nginx/html/web1/doc;
		index index.html;
	}
}

#2.doc下的文件如下:
[root@nginx01 web1]# tree doc/
doc/
├── file1.txt
└── file1.TXT

#3.重启nginx服务
[root@nginx01 web1]# systemctl reload nginx.service

#4.在客户端测试访问file1.txt和file1.TXT
[root@xuzhichao ~]# curl http://www.nginx01.com/file1.TXT
qwe
[root@xuzhichao ~]# curl http://www.nginx01.com/file1.txt
abc

1.4 匹配URI开始

#1.nginx的配置文件如下:
[root@nginx01 ~]# vim /etc/nginx/conf.d/virtualhost.conf 
server {
	listen 80;
	server_name www.nginx01.com;
	location / {
		root /data/nginx/html/web1;
		index index.html;
	}
	location ^~ /doc {
		root /data/nginx/html/web1;
		index index.html;
	}
	location /doc1 {
		alias /data/nginx/html/web1;
		index index.html;
	}	
}

#2.web1站点的目录结构如下:
[root@nginx01 web1]# cat  /data/nginx/html/web1/index.html 
www.nginx01.com
[root@nginx01 web1]# cat  /data/nginx/html/web1/doc/index.html 
doc.index

#3.重启nginx服务
[root@nginx01 web1]# systemctl reload nginx.service

#4.客户端测试
[root@xuzhichao ~]# curl http://www.nginx01.com/doc1/
www.nginx01.com
[root@xuzhichao ~]# curl http://www.nginx01.com/doc/
doc.index

1.5 测试location的优先级

#1.nginx的配置如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/virtualhost.conf 
server {
	listen 80;
	server_name www.nginx01.com;

	location = / {
		default_type text/html;
		return 200 'location = /\n';
	}
	location / {
		default_type text/html;
		return 200 'location /\n';
	}
	location /doc/dir1 {
		default_type text/html;
		return 200 'location /doc/dir1\n';
	}
	location ^~ /images {
		default_type text/html;
		return 200 'location ^~ /images\n';
	}
	location /doc {
		default_type text/html;
		return 200 'location /doc\n';
	}
	location ~* \.(jpg|gif|mp4)$ {
		default_type text/html;
		return 200 'location ~* \.(jpg|gif|mp4)\n';
	}
}

#2.重启nginx服务
[root@nginx01 web1]# systemctl reload nginx.service

#3.使用客户端访问不同的uri测试location的优先级
[root@xuzhichao ~]# curl http://www.nginx01.com/
location = /

[root@xuzhichao ~]# curl http://www.nginx01.com/index.html
location /

[root@xuzhichao ~]# curl http://www.nginx01.com/doc
location /doc

[root@xuzhichao ~]# curl http://www.nginx01.com/doc/dir1
location /doc/dir1

[root@xuzhichao ~]# curl http://www.nginx01.com/doc/1.txt
location /doc

[root@xuzhichao ~]# curl http://www.nginx01.com/images/1.jpg
location ^~ /images

[root@xuzhichao ~]# curl http://www.nginx01.com/doc/1.jpg
location ~* \.(jpg|gif|mp4)

[root@xuzhichao ~]# curl http://www.nginx01.com/doc/dir1/1.jpg
location ~* \.(jpg|gif|mp4)

1.6 location的生产使用示例

#1.直接匹配网站根会加速nginx的访问处理
location / {
		......;
}

#2.访问静态资源,不区分大小写
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
		......;
}

#3.精准匹配
location = /nginx_status {
		......;
}

#4.区分大小写,匹配php资源
location ~ \.php$ {
		......;
}

#5.多应用配置
location ~* /app1 {
		......;
}
location ~* /app2 {
		......;
}
上一篇:docker 应用篇————nginx 例子[六]


下一篇:docker-day7