Nginx Location 路径匹配

Nginx 经过不一样的 location 配置来匹配访问的 uri. 这样即可以作到对不一样的 uri 执行不一样的操做.html

location 的路径匹配能够分为两种: 前缀匹配和正则匹配, 基本语法为:nginx

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

其中, =, ^~, ~~*分别表示:
=: 精确匹配 => 前缀匹配;
^~: 优先前缀匹配 => 前缀匹配;
~: 正则匹配(大小写敏感) => 正则匹配;
~*: 正则匹配(大小学不敏感) => 正则匹配;bash

匹配规则

  1. 首先检查使用前缀匹配的 location, 找到最长匹配项而且记录下来
  2. 若是找到了精确匹配的 location(=), 则结束查找, 直接使用该 location 的配置; 若是最长匹配的 location 是优先前缀匹配(^~), 也结束查找, 使用该 location 的配置
  3. 而后按照顺序检查使用正则匹配的 location, 一旦匹配则结束查找, 直接使用匹配的 location 的配置
  4. 若是找完全部的正则匹配后仍是没有匹配到, 则采用前缀匹配查找时记录下来的的最长匹配项的 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'memcached

前缀匹配中的 slash 后缀

若是在 location 前缀匹配中以斜线 / 结尾, 而且 location 中的配置为proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass 或者 grpc_pass 中的一个. 在访问的时候若是没有斜线结尾, 那么 Nginx 会默认返回带斜线的 301 重定向. 好比:spa

location /doc-1/ {
    proxy_pass http://localhost:3000;
}
复制代码

不带 slash 访问 code

不带 slash 访问
带slash 访问
带slash 访问

可是若是在配置 location 的时候没有以斜杠结尾, 形成的结果是当你以加斜杠的 uri 去访问的时候, Nginx 没法匹配该 uri.cdn

location /doc-2 {
    proxy_pass http://localhost:3000;
}
复制代码

不带 slash 访问 htm

不带 slash 访问
带 slash 访问
带 slash 访问

参考:
ngx_http_core_module.html#locationblog

相关文章
相关标签/搜索