我有一个文件下载网站,我通过Laravel提供文件的热链接保护,但似乎下载使我的php进程存活了很长时间(因为一些用户的下载速度很差)。
对于热链接保护,我创建一个会话时,用户进入下载页面,并检查当他们点击下载按钮。
有没有办法做热链接保护,或我可以只是降低内存使用?
这是触发下载的代码:
if($request->session()->get('file') == $apk->generated_filename)
{
$headers = array
(
'Content-Type' => 'application/vnd.android.package-archive'
);
Apk::find($apk->id)->increment('downloads_co');
return response()->download(config('custom.storage') . $apk->generated_filename, $apk->filename, $headers);
}发布于 2018-07-09 20:52:02
使用X-Accel-Redirect和internal location
绝对最好的方法是在nginx端使用http://nginx.org/r/internal,并在上游侧使用X-Accel-Redirect的Header字段进行响应,以便nginx处理。
除非受到标头等人的阻止,否则nginx会对X-Accel-Redirect上游HTTP响应头执行特殊处理--它会导致nginx内部重定向(您应该对带有internal指令的location进行重定向,以确保直接访问此类文件的唯一可能方式是完全通过这样的内部重定向)。
这里的想法是,PHP脚本仍然可以以您认为必要的任何方式处理身份验证和热链接保护--用户身份验证、链接过期、基于人工智能的单独黑名单以及所有这些--但最终,一旦脚本完成,将以最有效的方式直接通过nginx向客户端提供文件。
(请注意,使用internal关键字是非常重要的-它确保恢复下载的唯一方法,一旦由于任何原因而中断,将首先通过与您的PHP脚本联系。因此,有了nginx烹饪书中的这个巧妙且经过验证的技巧,您将获得两个世界的最佳效果--对热链接和最佳资源利用的完全控制。)
发布于 2018-07-10 13:48:35
您应该按缓冲区大小读取文件(例如2k ),然后发送响应,不要立即发送整个响应,编写如下脚本来下载文件:
ignore_user_abort(true);
set_time_limit(0); \
$path = "/absolute_path_to_your_files/"; // change the path to fit your websites document structure
$dl_file = preg_replace("([^\w\s\d\-_~,;:\[\]\(\).]|[\.]{2,})", '', $_GET['download_file']); // simple file name validation
$dl_file = filter_var($dl_file, FILTER_SANITIZE_URL); // Remove (more) invalid characters
$fullPath = $path.$dl_file;
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a file download
break;
// add more headers for other content types here
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
break;
}
header("Content-length: $fsize");
header("Cache-control: private"); //use this to open files directly
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);发布于 2018-07-03 14:20:15
你可以用一个.htaccess来做这个。
您既可以使用此生成器,也可以使用以下代码并自己修改它。
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]https://stackoverflow.com/questions/50909921
复制相似问题