概述
Nginx 通过不同的 location 配置来匹配访问的 uri. 这样便可以做到对不同的 uri 执行不同的操作.
location 的路径匹配可以分为两种: 前缀匹配和正则匹配, 基本语法为:
location [ = | ~ | ~* | ^~ ] uri {
...
}
复制代码
其中, =
, ^~
, ~
和 ~*
分别表示:=
: 精确匹配 => 前缀匹配;^~
: 优先前缀匹配 => 前缀匹配;~
: 正则匹配(大小写敏感) => 正则匹配;~*
: 正则匹配(大小学不敏感) => 正则匹配;
匹配规则
- 首先检查使用前缀匹配的 location, 找到最长匹配项并且记录下来
- 如果找到了精确匹配的 location(
=
), 则结束查找, 直接使用该 location 的配置; 如果最长匹配的 location 是优先前缀匹配(^~
), 也结束查找, 使用该 location 的配置 - 然后按照顺序检查使用正则匹配的 location, 一旦匹配则结束查找, 直接使用匹配的 location 的配置
- 如果找完所有的正则匹配后还是没有匹配到, 则采用前缀匹配查找时记录下来的的最长匹配项的 location 的配置
栗子:
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* .(gif|jpg|jpeg)$ {
[ configuration E ]
}
复制代码
以上配置中:/
: 精确匹配 A, 则直接采用配置 A, 不再继续检查./index.html
: 首先检查前缀匹配, 最长匹配为 B; 然后检查正则匹配, 未匹配到, 则采用配置 B./documents/documents.html/
: 首先检查前缀匹配, 最长匹配为 C; 然后检查正则匹配, 未匹配到, 则采用配置配 C./images/pic.jpg
: 首先检查前缀匹配, 匹配到最长匹配为 D, 此时 D 为优先前缀匹配, 不再继续检查, 直接采用配置 D;/documents/pic.jpg
: 首先检查前缀匹配, 最长匹配为 C; 然后按照顺序检查正则匹配, 匹配了 E, 则停止检查, 直接采用配置 D'
前缀匹配中的 slash 后缀
如果在 location 前缀匹配中以斜线 /
结尾, 并且 location 中的配置为proxy_pass
, fastcgi_pass
, uwsgi_pass
, scgi_pass
, memcached_pass
或者 grpc_pass
中的一个. 在访问的时候如果没有斜线结尾, 那么 Nginx 会默认返回带斜线的 301
重定向. 比如:
location /doc-1/ {
proxy_pass http://localhost:3000;
}
复制代码
不带 slash 访问
带slash 访问但是如果在配置 location 的时候没有以斜杠结尾, 造成的结果是当你以加斜杠的 uri 去访问的时候, Nginx 无法匹配该 uri.
location /doc-2 {
proxy_pass http://localhost:3000;
}
复制代码
不带 slash 访问
带 slash 访问参考:
ngx_http_core_module.html#location
转载于:https://juejin.im/post/5be19053e51d455bad08a342
最后
以上就是贤惠汉堡为你收集整理的Nginx Location 路径匹配的全部内容,希望文章能够帮你解决Nginx Location 路径匹配所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复