我的服务器上有以下文件夹层次结构:
/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。
看这个文件了解详情。