上一篇 Nginx 虚拟主机
Nginx location
在 nginx 的配置文件中,经常可以看到虚拟主机配置中出现 location {}
模块,前面说过,这是根据 URI 将特定的文件或目录重新定位处理,比如静态资源、php文件等。
语法及语境
# 语法
location [ = | ~ | ~* | ^~ ] uri {
...
}
location @name {
...
}
# 语境(常用于以下模块)
server
location
location = uri { ... }
:使用 “=” 定义精准匹配,当接收到请求之后,会先进行精准匹配,加入匹配到正确项,则终止搜索。location uri { ... }
:一般字符串匹配,匹配到最长前缀则返回结果进行正则表达式匹配location ^~ uri { ... }
:(非正则表达式)匹配到的最长前缀之前如果带有 “^~” 则停止继续匹配正则表达式location ~ uri { ... }
:使用 “~” 后接正则表达式,区分大小写location ~* uri { ... }
:同样使用正则表达式匹配,不区分大小写location @name uri { ... }
:注意当出现 “@” 时,表示这个location
不是一般请求处理,而是请求重定向
location {}
模块可以进行嵌套,但是一些特殊的情况除外,比如:精准匹配,前缀带有 @
等。
顺序及过程
- 顺序
如果在配置文件中有多个 location {}
模块,则需要注意这些模块的匹配顺序。在官方文档中,使用了以下的配置进行说明:
server {
listen 80;
server_name localhost;
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
}
如上,每一个 location {}
对应一个配置,分别是 [ configuration A ] ~ [ configuration E ]。
当请求为 domain.cm/ 时,将匹配到 [ configuration A ] 。
当请求为 domain.cm/index.html 时,将匹配到 [ configuration B ] 。
当请求为 domain.cm/document/document.html 时,将匹配到 [ configuration C ] 。
当请求为 domain.cm/images/image.gif 时,将匹配到 [ configuration D ] 。(这一点要注意,因为 [ configuration D ] 对应的
location
使用带有 “^~” 符号,所有不会继续进行正则表达式匹配)当请求为 domain.cm/documents/image.jpg 时,将匹配到 [ configuration E ] 。
顺序是:精准匹配 > 正则表达式 > 普通匹配
- 过程
location 匹配的过程其实很简单,如下:
...
server_name domain.cm;
location = / {
root /var/web;
index index.html;
}
location / {
root /usr/local/nginx/html;
index index.html;
}
...
如上 配置,当接收到 domain.cm/ 请求时,“/” 首先精准匹配到第一个 location
,索引文件为 index.html,所以返回 “/index.html”,之后继续搜索,因为不符合第一个精准匹配,所以匹配到第二个 location
,最后的结果就是 “/usr/local/nginx/index.html”。
总的来说,匹配的过程就是接收到请求后按照顺序进行匹配,一般来说是:精准匹配(如果匹配到则结束,没有则下一步)->普通匹配(匹配到最长前缀,并记录下来,不结束,进行正则匹配)->正则表达式匹配->普通匹配
要注意 location
在配置文件中书写的位置(前后顺序)对普通匹配的结果没有影响,因为是一直匹配到最长前缀,而对正则表达式匹配却有影响,因为是按照先后顺序进行匹配的。
下一篇 暂无