Nginx的location块相关知识积累
注意:如果Nginx的配置中有多个location块,那么各location块的匹配优先级并不是完全按照代码的先后顺序来决定各location优先级的。而是按下面的规则来决定的:
在 Nginx 中,location
块的匹配是按照以下原则的:
前缀匹配: 具有更长前缀的 location
会优先匹配。如果一个 location
的前缀是另一个 location
的前缀,那么较长前缀的 location
会被优先匹配。
正则表达式匹配: 如果存在正则表达式匹配的 location
,那么正则表达式匹配会优先于前缀匹配。在正则表达式匹配中,越具体的规则(越长或者包含特定字符)会优先匹配。
比如有下面的Nginx的location配置代码:
location / {
proxy_pass http://127.0.0.1:55113;
}
#301 Not Config
#拒绝访问的文件
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#静态文件
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log off;
access_log /dev/null;
}
location ~ .*\.(js|css)?$
{
expires 12h;
error_log off;
access_log /dev/null;
}
在这个 Nginx 配置中,按照以上原则,location
块的优先级顺序是:
/
:最基本的前缀匹配,匹配所有请求。因为它是最短的前缀匹配,而不是正则匹配,所以是最低优先级。
~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
:正则表达式匹配,匹配特定文件路径的请求。
~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
:正则表达式匹配,匹配以指定后缀结尾的静态文件请求。
~ .*\.(js|css)?$
:正则表达式匹配,匹配以指定后缀结尾的静态文件请求。
即第1个匹配的优先级是最低的,即上面的4个location块被分成了两组:
第一组是第1个,属于前缀匹配;
第二组是第2、3、4个,都属于正则匹配。
如果一个请求能同时匹配第一组和第二组,那么将使用第二组中的location块,因为第二组的优先级比第一级的优先级高。如果一个请求能同时匹配第2、3、4个 location 块,将选择第2个 location 块,因为它在配置文件中出现得更早。
关于正则表达式,之前已经写了些文章了,在看以下内容前可以先复习一下。
01-Nginx中的正则匹配表达式操作符~
和~*
的含义
02-正则表达式中+ 与 * 有啥区别?
03-Python的正则表达式re模块的compile()方法有什么作用?
04-正则表达式中的方括号[]有什么用?
05-正则表达式中的大括号-花括号{}有什么用?
06-Python正则表达式re模块的相关知识积累与博文汇总–这篇文章强烈建看一下!
~
和~*
~
操作符表示区分大小写的匹配。
~*
操作符表示不区分大小写的匹配。
~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
~
操作符表示区分大小写的匹配。
^
操作符表示匹配字符串的开头位置,详情见:Python正则表达式re模块的相关知识积累与博文汇总的第04点。这里操作符^
和/
合起来的^/
表示匹配以斜杠/
开头的路径。
\
表示转义,因为点在正则表达式中是一个特殊字符,表示匹配任意字符(除了换行符)。所以\.
是为了匹配实际的点。
所以整个正则表达式:
~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
表示匹配以下面为前缀的URL路径:
/.user.ini
/.htaccess
/.git
/.svn
/.project
/LICENSE
/README.md
即网站根目录下的文件或目录.user.ini、.htaccess、.git、.svn、.project、LICENSE、README.md
是禁止访问的。
注意:URL路径:/.svn/configure.txt 也是被匹配的。因为前缀/.svn/
得到了匹配。
~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
出自:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log off;
access_log /dev/null;
}
~
操作符表示区分大小写的匹配。
.*
:.
在正则表达式中是一个特殊字符,表示匹配任意字符(除了换行符)。*
表示匹配前面的模式零次或多次。整个合起来是说“匹配任意字符零次或多次”。
\.
:其中的\
表示转义,因为点在正则表达式中是一个特殊字符,表示匹配任意字符(除了换行符)。所以\.
是为了匹配实际的点。
$
:表示在字符串的结尾处进行匹配。
所以上面这个正则表达式是匹配图片类静态资源。
~ .*\.(js|css)?$
~ .*\.(js|css)?$
出自:
location ~ .*\.(js|css)?$
{
expires 12h;
error_log off;
access_log /dev/null;
}
~
操作符表示区分大小写的匹配。
.*
:.
在正则表达式中是一个特殊字符,表示匹配任意字符(除了换行符)。*
表示匹配前面的模式零次或多次。整个合起来是说“匹配任意字符零次或多次”。
\.
:其中的\
表示转义,因为点在正则表达式中是一个特殊字符,表示匹配任意字符(除了换行符)。所以\.
是为了匹配实际的点。
?
: 这表示前面的字符(这里是 (js|css)
)是可选的,可以出现零次或一次。在这里,它表示文件名可能以 .js
或 .css
结尾,也可能没有这两者。
$
:表示在字符串的结尾处进行匹配。
所以上面这个正则表达式是匹配以 .js
、 .css
或以.
结尾但无具体的文件后缀名结尾的静态资源。
例1:
location ~ .*\.(js|css)?$
{
expires 12h;
error_log off;
access_log /dev/null;
}
例2:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log off;
access_log /dev/null;
}
expires 12h;
: 此指令设置内容的过期时间。它告诉客户端(浏览器)将文件缓存 12 小时 (12h
)。这可以通过在指定的时间范围内减少客户端反复下载相同静态文件的需求来提高网站性能。
expires 30d;
: 此指令设置内容的过期时间。它告诉客户端(浏览器)将文件缓存 30 天 (30d
)。这可以通过在指定的时间范围内减少客户端反复下载相同静态文件的需求来提高网站性能。
例:
location ~ .*\.(js|css)?$
{
expires 12h;
error_log off;
access_log /dev/null;
}
error_log off;
: 此指令关闭了匹配此位置的请求的错误日志记录。这意味着与 JavaScript 和 CSS 文件相关的请求错误将不会被记录。
例:
location ~ .*\.(js|css)?$
{
expires 12h;
error_log off;
access_log /dev/null;
}
access_log /dev/null;
: 此指令将访问日志路径设置为 /dev/null
,有效地禁用了与此位置匹配的请求的访问日志记录。访问日志记录有关每个请求的信息,通过将其重定向到 /dev/null
,你正在丢弃这些特定请求的详细访问日志信息。如果不需要为某些静态文件生成详细的访问日志,这样做可以减少磁盘 I/O 并提高性能。