![X-Accel-Redirect 恢复中断的下载](https://linux22.com/image/734726/X-Accel-Redirect%20%E6%81%A2%E5%A4%8D%E4%B8%AD%E6%96%AD%E7%9A%84%E4%B8%8B%E8%BD%BD.png)
我正在使用 Nginx X-Accel-Redirect 为用户提供一个大型受保护文件(几 GB)。服务器应用程序处理 URL 并验证下载令牌(嵌入在 URL 中)并开始或拒绝下载。问题是,如果下载因任何原因失败,则无法恢复下载。文件真的很大,因此发生这种情况的可能性不容忽视。
更多信息,服务器位于 AWS EC2 上,文件位于 S3 bucket 中。这意味着我们也需要为下载失败付费。
我想知道是否可以使用下载令牌或其他方式保护文件,以便用户不能仅仅与他人共享下载链接,而且在网络断开连接的情况下仍然可以恢复。
python 服务器正在将以下标头转发到 Nginx。
content_type='application/force-download'
Content-Disposition='attachment; filename=xxx'
X-Accel-Redirect=<url>
Nginx配置如下。
location ~ ^/protected/(.*) {
internal;
resolver 8.8.8.8;
resolver_timeout 60;
proxy_hide_header Content-Type; # To hide header from S3
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_set_header Content-Type 'application/force-download';
proxy_max_temp_file_size 0;
proxy_pass https://***.amazonaws.com/***/$1;
}
答案1
看起来你正在将请求代理到 S3,而不是提供服务预签名 URL和普通的重定向(例如 303),而不是 X-Accel-Redirect,后者通常是用于制作过期链接的操作。
就您而言,我预计 Range 请求标头将被删除。您应确保使用 中的请求标头从浏览器传递到 S3 proxy_pass_request_headers on;
。location
此外,您可能不应该internal
为该 定义location
。