如何在 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=]
解释:
^
- 声明行的开头
^([^.]*)
- 匹配出现次数超过 0 次的任何非 .
字符,并将其捕获到组 1 中
(\w{2})
- 匹配 2 个单词字符并将其捕获到组 2
(\w{1})
- 匹配 1 个单词字符并将其捕获到组 3
.*
- 匹配出现次数超过 0 次的任何字符,换行符除外
$
- 断言行尾
所以正则表达式是一个很大的帮助,但为了具体回答我自己的问题,这是我如何做到的我使用下面的地图来获取我的文件夹结构
map $uri $directory {
~(?<suffix>(..)(.).[^.]*)$ ///;
}
现在上面的地图会给我
/e/4b/
我在 nginx 的位置指令中使用,如下所示
location /test/ {
alias /home/fileTest/$directory;
}
我正在尝试根据文件名提供文件,例如下面是文件名
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=]
解释:
^
- 声明行的开头^([^.]*)
- 匹配出现次数超过 0 次的任何非.
字符,并将其捕获到组 1 中
(\w{2})
- 匹配 2 个单词字符并将其捕获到组 2(\w{1})
- 匹配 1 个单词字符并将其捕获到组 3.*
- 匹配出现次数超过 0 次的任何字符,换行符除外$
- 断言行尾
所以正则表达式是一个很大的帮助,但为了具体回答我自己的问题,这是我如何做到的我使用下面的地图来获取我的文件夹结构
map $uri $directory {
~(?<suffix>(..)(.).[^.]*)$ ///;
}
现在上面的地图会给我
/e/4b/
我在 nginx 的位置指令中使用,如下所示
location /test/ {
alias /home/fileTest/$directory;
}