Nginx location 配置讲解

2023-02-01 04:03:15 阅读:1222 评论:0 点赞:0
所属分类: Nginx

Location 是 Nginx 中一个非常核心的配置,这篇重点讲解一下 Location 的配置问题以及一些注意事项。

一、语法

下面是关于 location 的一个简单配置:

http {
    server {
        listen 80;
        server_name www.shiqz.cn;

        location / {
            root /var/www/html;
            index index.html;
        }
    }
}

大致意思是,当你访问 www.shiqz.cn80 端口时会返回 /var/www/html/index.html 文件。

location 的具体语法:

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

[ = | ~ | ~* | ^~ ] 这其中用 | 分隔的内容是我们可能需要用到的语法:

= 表示精确匹配:

location = /test {
		return 200 "This is test.";
}

简而言之,后面的 uri 必须是 /test 才会匹配成功。


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

location ~ ^/test$ {
	return 200 "hello";
}

# /test 	=> ok
# /Test 	=> not ok
# /test/ 	=> not ok
# /test2  => not ok

~* 表示不区分大小写的正则匹配:

location ~* ^/test$ {
	return 200 "hello";
}

# /test 	=> ok
# /TEST 	=> ok
# /test/ 	=> not ok
# /test2  => not ok

^~ 表示以某个字符开头:

location ^~ /images/ {
	return 200 "this is image";
}

/ 表示通用匹配

location / {     
	[ configuration ] 
}

二、匹配顺序

location 的定义分为两种:前缀字符串和正则表达式(~~*
1、检查使用前缀字符串的 locations,在使用前缀字符串的 locations 中选择最长匹配的,并将结果进行储存
2、如果符合带有 = 修饰符的 URI,则立刻停止匹配
3、如果符合带有 ^~ 修饰符的 URI,则也立刻停止匹配。
4、然后按照定义文件的顺序,检查正则表达式,匹配到就停止
5、当正则表达式匹配不到的时候,使用之前储存的前缀字符串

即:
在顺序上,前缀字符串顺序不重要,按照匹配长度来确定,正则表达式则按照定义顺序。
优先级上,= 修饰符最高,^~ 次之,再者是正则,最后是前缀字符串匹配。

示例1(前缀字符串匹配顺序):

location /doc {
    return 200 "/doc";
}
location /docu {
    return 200 "/docu";
}

# /docu

请求 http://localhost/document 将匹配到 /docu;证明在顺序上,前缀字符串顺序不重要,按照匹配长度来确定。

示例2(正则优先级):

location ~ ^/doc {
    return 200 "/doc";
}
location ~ ^/docu {
    return 200 "/docu";
}

# /doc
location ~ ^/docu {
    return 200 "/docu";
}
location ~ ^/doc {
    return 200 "/doc";
}

# /docu

请求 http://localhost/document 都将匹配到第一个,证明正则匹配到第一个就立即停止匹配。

示例3(优先级):

location ~ ^/doc {
    return 200 "/doc";
}

location ^~ /docu {
    return 200 "/docu";
}

# /docu

请求 http://localhost/document 虽然 ~ ^/doc 也匹配,顺序上还在前面,但是 ^~ /docu 的优先级更高。

location /document {
    return 200 "/document";
}

location ~ ^/docu {
    return 200 "/docu";
}

# /docu

请求 http://localhost/document 虽然 /document 也匹配,顺序上还在前面,但是 ~ ^/docu 的优先级更高。

server 和 location 中都有 root 时,使用 location 中指定的 root,采取就近原则。

标签: nginx location

不拘一格

职业:后端开发工程师
学校:重庆师范大学
城市:重庆
文章:165
一个喜欢学习的人,快来和我成为朋友吧....

登录逐梦笔记

注册逐梦笔记

已有账号?