nginx根据url正则表达式获取root并使用一些计算规则

时间:2014-12-11 17:58:39

标签: nginx

给出这样的网址: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

我该如何写这条规则?请帮助我理解。

1 个答案:

答案 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,如果位置不直接映射到文件系统路径,则使用别名。