使用 nginx 隐藏服务器上图像的文件夹结构

使用 nginx 隐藏服务器上图像的文件夹结构

我的服务器上有以下文件夹层次结构:
/var/images/d/d8/d82fa6c3eed/image.png

目录结构由 MD5 哈希创建,并分为子文件夹。

我想使用 Nginx 向 Web 用户提供图片,但不想暴露目录结构。例如,我不是想要提供这样的文件:
http://domain.tld/d/d8/d82fa6c3eed/image.png

我想提供类似这样的服务:
http://domain.tld/b/4324re3fg34f6td/image.png

我也在使用 nginxsecure link模块,但是必须指定获取图像的目录,如下所示:
http://domain.tld/b/<secure link MD5 hash>/path/to/file.png

重写为:
http://domain.tld/images/path/to/file.png?md5=<secure link md5>

我不想在文件系统上指定实际的特定目录路径来获取文件。我的想法如下:

  • 客户端可以发送某种表示文件目录路径的 MD5 值,NGINX 将每 N 个字符插入一个 /。这可能吗?
  • 发送以 base64 编码的目录路径,然后让 NGINX 对其进行解码并在内部重定向到那里。还有这个?
  • 也许可以使用一个额外的模块,比如 openresty 模块?

我能实现这个目标吗?

我的 nginx 配置:

server {
    ..
    root /var/www/html;
    ..
    location /b/ {
        rewrite ^/b/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)/(.*)$ /images/$2/$3?md5=$1 last;
    }
    location /images/ {
        internal;
        secure_link $arg_md5;
        secure_link_md5 '$uri mysecretkey';
        if($secure_link = "") { return 404; }
        if($secure_link = "0") { return 410; }
    }
}

答案1

我没有使用过secure_link,因此无法评论您提案的这一部分。但是您的配置中有一个明显的错误,即rewrite...last如果您希望块处理重写的 URI,则应该使用location /images/后缀break,这会导致在同一位置处理 URI。

这个文件了解详情。

相关内容