如何在 nginx 中根据文件名的最后三个字符提供文件

How to serve files based on filename's last three characters in nginx

我正在尝试根据文件名提供文件,例如下面是文件名

zielinski-6b7982e5-5743-41c4-a854-1257812e4be.jpeg

位于下方

/e/4b/zielinski-6b7982e5-5743-41c4-a854-1257812e4be.jpeg

现在文件名的最后三个字符用于目录结构,即最后一个字符 'e' 是第一个目录,倒数第二个字符内的“4b”是子目录,其中是文件 'zielinski-6b7982e5-5743-41c4-a854-1257812e4be.jpeg' 存在

我能够通过在 nginx

中使用下面的映射从请求 url 中获取文件名
map $basename $filenameOne {
    ~(?<abx>\.[^\.]*)$ $abx;
    }

所以我从上面的地图得到的结果是 'zielinski-6b7982e5-5743-41c4-a854-1257812e4be.jpeg' 但我想要上面提到的目录结构来为这些文件提供服务,这可以在 nginx 中使用重写正则表达式来完成,还是我需要使用位置正则表达式帮助会很大

使用这个正则表达式:

^([^.]*)(\w{2})(\w).*$

并通过以下方式捕获目录(包括文件名):

///[=11=]

Click for Demo

解释:

  • ^ - 声明行的开头
  • ^([^.]*) - 匹配出现次数超过 0 次的任何非 . 字符,并将其捕获到组 1
  • (\w{2}) - 匹配 2 个单词字符并将其捕获到组 2
  • (\w{1}) - 匹配 1 个单词字符并将其捕获到组 3
  • .* - 匹配出现次数超过 0 次的任何字符,换行符除外
  • $ - 断言行尾

所以正则表达式是一个很大的帮助,但为了具体回答我自己的问题,这是我如何做到的我使用下面的地图来获取我的文件夹结构

map $uri $directory {
~(?<suffix>(..)(.).[^.]*)$ ///;
}

现在上面的地图会给我

/e/4b/

我在 nginx 的位置指令中使用,如下所示

location /test/ {

alias /home/fileTest/$directory;

}