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

时间:2018-02-03 07:25:21

标签: regex nginx regex-lookarounds regex-group nginx-location

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

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

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

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

2 个答案:

答案 0 :(得分:2)

Use this regex:

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

and capture the directory(including the filename) by the following:

/\3/\2/\0

Click for Demo

Explanation:

  • ^ - asserts the start of the line
  • ^([^.]*) - matches 0+ occurrences of any character that is not a . and capture it in group 1
  • (\w{2}) - match 2 word-characters and capture it in group 2
  • (\w{1}) - match 1 word-character and capture it in group 3
  • .* - matches 0+ occurrences of any character except a newline
  • $ - asserts the end of the line

答案 1 :(得分:1)

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

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

现在上面的地图会给我

/e/4b/

我在nginx的location指令中使用,如下面的

location /test/ {

alias /home/fileTest/$directory;

}