Location 是 Nginx 中一个非常核心的配置,这篇重点讲解一下 Location 的配置问题以及一些注意事项。
一、语法
下面是关于 location 的一个简单配置:
http {
server {
listen 80;
server_name www.shiqz.cn;
location / {
root /var/www/html;
index index.html;
}
}
}
大致意思是,当你访问 www.shiqz.cn
的 80
端口时会返回 /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,采取就近原则。