给出这样的网址:media / images / 293_84072edb91d2b62387f529e2c4456c85f4dadee5
我想通过以下规则获得路径:
如果
location ~* /media/images/\d*_(?<hash>[a-z0-9]{40})
然后
获取var $ hash(84072edb91d2b62387f529e2c4456c85f4dadee5),得到它的第一个字符('8'),例如让我们用$ hash [0]命名它 那么第二和第三个字符在一起('40'),由$ hash [1:3]命名 然后nginx可以拍摄图像的根必须看起来像这样:
媒体/图像/ $散列[1] / $散列[1:3] / $散列 root - &gt;媒体/图像/ 8/40 / 84072edb91d2b62387f529e2c4456c85f4dadee5
我该如何写这条规则?请帮助我理解。
答案 0 :(得分:3)
location ~ ^/media/images/\d*_(?<hash0>[a-z0-9])(?<hash13>[a-z0-9]{2})(?<hash>[a-z0-9]{37})$ {
alias /server/path/$hash0/$hash13/$hash0$hash13$hash;
}
顺便说一句,在纯nginx中,你不能像编程语言那样使用字符串。 Nginx只有regexp。
但是regexp可以将字符串的任何部分作为组。在您的示例中,40个哈希符号被捕获为命名组。但是你可以轻松创建2个捕获组:一个带有1个符号,第二个带有下一个39个符号。或者,可以创建3个捕获组:使用1个符号(在我的示例中为(?<hash0>[a-z0-9])
),接下来的2个符号((?<hash13>[a-z0-9]{2})
)和接下来的37个符号((?<hash>[a-z0-9]{37})
)。所有团体都有自己的名字。现在我们可以使用此捕获创建路径。
顺便说一下,不需要组名,这个例子可以写成
location ~ ^/media/images/\d*_([a-z0-9])([a-z0-9]{2})([a-z0-9]{37})$ {
alias /server/path/$1/$2/$1$2$3;
}
如果您的regexp很少(在位置,服务器名称,if等),则命名组很重要。
现在,为什么alias
而不是root
。 Root - 它是此位置的服务器根。如果位置/ a /和root /home/www/
- /a/test.txt的文件路径将是/home/www/a/test.txt。别名替换当前位置,因此如果alias /home/www/
- /a/test.txt的文件路径为/home/www/test.txt。
因此,如果您的位置和文件结构相同,则使用root,如果位置不直接映射到文件系统路径,则使用别名。