常用基础 - location 命令 ¶
作者:KK
发表日期:2020.03.21
介绍 ¶
经常会在主机配置里看到location
这个命令,它的作用是匹配 URL 然后在花括号里面执行一些指令,这些指令各种各样。
使用语法为:
location 匹配模式 匹配符号 {
执行指令
}
其中匹配符号有时候是可以省略的。
基本示例:使用不同的 root 目录 ¶
server {
listen 80;
server_name xxx.com;
index index.html;
location ^~ /aaa {
root /var/www/folder1; #目录1
}
location ^~ /bbb {
root /home/wwwroot/folder2; #目录2
}
}
以上用到了^~
这个匹配符号,它的意思是匹配以某些字符串开头的 URI。
请求http://xxx.com/aaa/1.html
的时候,会读取/var/www/folder1/aaa/1.html
,因为 web 根目录被设定为/var/www/folder1
。
而请求http://xxx.com/bbb/2.html
的时候,会读取/home/wwwroot/folder2/bbb/2.html
。
这个示例只是提供一个试验和理解,而在实践中基本不会有人这么用,首先就没什么这样的需求,极少。
正则匹配 ¶
以下是区分大小写的匹配模式:
location ~ /Aaa\d+ {
#...
}
匹配/Aaa321
这个请求地址但不匹配/aaa321
,如果要忽略大小写请改成~*
匹配模式,比如location ~* /aaa\d+
正则的实际例子 ¶
匹配特定后缀的请求资源,缓存一定时长,下次再来请求就让浏览器读取浏览器自己的缓存。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
#缓存30天
expires 30d;
}
location ~ .*\.(js|css)?$
{
#缓存12小时
expires 12h;
}
匹配所有地址 ¶
如果希望无论任何请求都执行特定指令,可以直接loaction / { ... }
就可以了,这个/
就是匹配模式,表示匹配任何地址,这样的话也不需要说明匹配符号了,下面来个例子。
实例:所有请求地址都忽略 index.php ¶
location / {
try_files $uri $uri/ /index.php$is_args$args;
}