Nginx - location 指令(二)

location directive

bash 复制代码
location [ = | ~ | ~* | ^~ ] uri {

}

不讨论 location @name {} 形式

官方文档有如下描述:

A location can either be defined by a prefix string , or by a regular expression .

Regular expressions are specified with the preceding ~* modifier (for case-insensitive matching), or the ~ modifier (for case-sensitive matching).

To find location matching a given request,

  • nginx first checks locations defined using the prefix strings (prefix locations). Among them, the location with the longest matching prefix is selected and remembered.
  • Then regular expressions are checked, in the order of their appearance in the configuration file. The search of regular expressions terminates on the first match, and the corresponding configuration is used.
  • If no match with a regular expression is found then the configuration of the prefix location remembered earlier is used.

If the longest matching prefix location has the ^~ modifier then regular expressions are not checked.

Also, using the = modifier it is possible to define an exact match of URI and location. If an exact match is found, the search terminates.

location 指令由修饰符和匹配项组成,匹配项可以是 前缀字符串 (prefix string,也就是仅从uri的开头匹配) 或者 正则表达式(regular expression,uri全局正则匹配),共有以下五种组合

  • prefix-string
  • = prefix-string
  • ~ regular-expression 大小写敏感
  • ~* regular-expression 大小写不敏感
  • ^~ prefix-string

注意查找匹配顺序,查找和使用的优先级并不一样:

  1. 精确匹配= prefix-string,成功则停止;
  2. 匹配其他prefix strings,选中并记住所有匹配成功中的最长匹配 (longest matching prefix);如果当前最长匹配有^~修饰符,则停止;
  3. 正则匹配[~* | ~] regular expressions,顺序为在配置文件中的出现顺序,成功则停止;
  4. 使用第2步查找到的最长匹配项,否则404 Not Found。

测试

复制代码
	location / {
		return 200 '/\n';
	}

	location /images/avatars {
		return 200 '/images/avatars\n';
	}
	
	location = /images {
		return 200 '= /images\n';
	}
	
	# 注意是否是前缀匹配 **成功** 中的 **最长** 项目
	location ^~ /images {
		return 200 '^~ images\n';
	}
	
	location ~* \.(png|jpg)$ {
		return 200 '~* \.(png|jpg)\n';
	}
url location 顺序
curl localhost / 1.2(/).3.4.=>2(/).
curl localhost/x / 1.2(/).3.4.=>2(/).
curl localhost/images = /images 1.
curl localhost/images/me.jpg ^~ images 1. 2(^~ /images).
curl localhost/images/avatars /images/avatars 1.2(/images/avatars).3.4.=>2(/images/avatars).
curl localhost/images/avatars/me.jpg ~* \.(png|jpg)$ 1.2(/images/avatars).3.
curl localhost/images/xxx/me.jpg ^~ images 1.2(^~ /images).

References

相关推荐
木头左8 小时前
【Nginx】内网服务源 IP 白名单实战:动态域名解析放行网段 + 端口接管零改造
运维·nginx·白名单·反向代理
skywalk816310 小时前
把 去也网站 从 Ubuntu 搬到 FreeBSD:一次 Service Jail + nginx 的部署实录
linux·运维·nginx·ubuntu·freebsd
没差c17 小时前
winsw将jar、nginx等注册为Windows服务
windows·nginx·jar
Lsetea3 天前
Docker更新SSL证书后容器仍读旧文件:单文件挂载与目录挂载排查
运维·nginx·docker·https·ssl证书
枫叶轻语5 天前
【Nginx 从入门到实战 09】前后端统一入口:部署页面与接口的完整配置
nginx·全栈
无言听风雨丶5 天前
Nginx 深度实战:从架构原理到生产排错
运维·nginx·架构
xxwl5855 天前
Nginx 基础学习笔记
笔记·学习·nginx
fb_123455 天前
K8s StatefulSet五大有状态集群实战_Nginx_Etcd_Redis_Cassandra_MySQL
nginx·kubernetes·etcd
acd120095 天前
域名解析缓存带来的隐性故障,很多排查都漏掉了这一层
java·运维·nginx
枫叶轻语6 天前
【Nginx 从入门到实战 07】root 与 alias:资源路径到底怎样对应?
nginx·全栈