Laravel下载响应,具有热链接保护和低内存使用率

时间:2018-06-18 12:48:28

标签: php laravel nginx download hotlinking

我有一个文件下载网站,我通过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);
        }

4 个答案:

答案 0 :(得分:1)

使用DoThing(1, "Hello World!");X-Accel-Redirect internal


绝对最佳的方法是利用nginx端的http://nginx.org/r/internal,并使用上游端location的HTTP响应头字段进行响应,以便nginx处理。

除非http://nginx.org/r/proxy_ignore_headers等人阻止,nginx会对X-Accel-Redirect上游HTTP响应标头执行特殊处理-它会在nginx内引起内部重定向(您应该对标记为X-Accel-Redirect的内部重定向与location指令一起使用,以确保直接访问此类文件的唯一可能方法是专有的内部重定向)。


这里的想法是,您的PHP脚本仍然可以以您认为必要的任何方式处理身份验证和热链接保护-用户身份验证,链接到期,基于AI的个人黑名单等等,但最终还是要脚本完成后,将直接通过nginx以最有效的方式将文件实际提供给客户端。

(请注意,使用internal关键字非常重要-它确保了恢复下载的唯一方法(无论出于何种原因而中断)将首先与您的PHP脚本联系。因此,经nginx食谱证明的技巧,您将获得两全其美的体验–完全控制热链接和最佳资源利用。)

答案 1 :(得分:1)

您应该按缓冲区大小(例如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);

答案 2 :(得分:0)

您可以为此使用.htaccess。

您可以使用此generator或使用以下代码并自行进行修改。

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]

答案 3 :(得分:0)

> bets[0].Team
(null)
> bets[1].Team
{betting.DAL.Primitives.Team}
    Id: 1
    Name: "Uruguay"
> bets[2].Team
(null)
> bets[3].Team
{betting.DAL.Primitives.Team}
    Id: 1
    Name: "Uruguay"
> bets[4].Team
(null)
> bets[5].Team
{betting.DAL.Primitives.Team}
    Id: 2
    Name: "Russia"
> bets[6].Team
(null)
> bets[7].Team
{betting.DAL.Primitives.Team}
    Id: 2
    Name: "Russia"
> 

参考:http://nodotcom.org/nginx-image-hotlink-rewrite.html