zl程序教程

您现在的位置是:首页 >  前端

当前栏目

nginx重新整理——————http请求的11个阶段中的find_config[十三]

NginxHTTP 请求 11 Find 阶段 config 十三
2023-09-14 08:59:23 时间

前言

简单介绍一下find_config 与 preaccess 阶段。

正文

find_config 很大一部分工作是进行location的匹配。

来一张图看下location指令和merge_slashes:

前缀字符串:

  1. 常规 比如/http,表示前缀是http,比如 http/aaa 这种。

  2. =:精确匹配,表示一定要和这个链接一模一样。

  3. ^~: 匹配上后则不再进行正则表达式匹配

正则表达式:

~: 大小写敏感的正则匹配
~*: 忽略大小写的正则匹配

合并连续的符号:

merge_slashes

用于内部跳转的命名location:

@ 这种。

下面给一些例子哈:

location的匹配规则:

然后来实验一下例子哈:

location ~ /Test1/$ {
	return 200 'first regular expressions match!\n';
}

location ~* /Test1/(\w+)$ {
	return 200 'longest regular expressions match!\n';
}

location ^~ /Test1/ {
	return 200 'stop regular expressions match!\n';
}

location /Test1/Test2 {
		return 200 'longest prefix string match!\n';
}

location /Test1 {
		return 200 'prefix string match!\n';
}


location = /Test1 {
	return 200 'exact match!\n';
}

实验一:

这里Test1 那么走的是精确匹配。

实验二:

这个是完全匹配,所以选择了3,这里有人就问了,这里~ /Test1/$ 不也是完全匹配吗?因为加了^~ 所以正则表达被拒了。

实验三:

可以看到其实这里面3个都匹配上了,但是因为匹配到了^~ /Test1/,字符最长,且加了^~所以选这个。

实验四:

因为/Test1/Test2完全匹配了,本来应该选择这个的,但是有正则匹配了,所以选正则。

优先级规则:

  1. 精确匹配

  2. 匹配字符串最长的,如果匹配字符串最长的没有加~^,那么就会查看正则表达。

  3. 然后是有多个正则表达,那么选正则表达第一个。

下一节介绍preaccess.