常用基础 - 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;
}