将图像请求重写为 Nginx 中的子目录结构

将图像请求重写为 Nginx 中的子目录结构

给定这样的位置:

location ~ ^/user-content/img/) {
  root /srv/foo/bar/uploads/;
  autoindex off;
  access_log off;
  expires 30d;
}

是否可以使用 nginx 来请求

/user-content/img/3AF1D3A69CE92ADAED8B0D25C2411595C7C798A5.png

实际上是从目录中提供服务,/srv/foo/bar/uploads/3A/F1/D3这需要从请求文件名中取出前两个字符并将它们用作第一个子文件夹,然后使用字符 3-4 作为下一个更深的文件夹,最后将字符 5-6 附加到最后一个子文件夹?

答案1

你可以尝试一下(未经测试)

location /user-content/img/ {
    rewrite "^/user-content/img/(\w{2})(\w{2})(\w{2})(.*)" /$1/$2/$3/$1$2$3$4 break;
    root /srv/foo/bar/uploads;
    autoindex off;
    access_log off;
    expires 30d;
}

更新

只需进行测试即可。可以确认此方法也有效。正如 OP 所指出的,带有花括号的正则表达式应在 nginx 配置中引用。

答案2

这种方法应该有效:

location ~ "^/user-content/img/([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})(.*)$" {
    root /srv/foo/bar/uploads;
    try_files /$1/$2/$3/$1$2$3$4 =404;
    autoindex off;
    access_log off;
    expires 30d;
}

在该location行中,我们使用正则表达式将文件名的各个部分捕获到四个不同的变量中,前三部分是目录,第四部分是文件名的其余部分。

指令中使用变量try_files来创建图像名称的路径。

相关内容