Ответ загрузки Laravel с защитой от хотлинка и низким использованием памяти

У меня есть веб-сайт для загрузки файлов, и я предоставляю файлы через 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);
}

3

Решение


Абсолютно лучшим способом является использование http://nginx.org/r/internal на стороне nginx, и сделайте ответ с полем заголовка ответа HTTP X-Accel-Redirect на верхней стороне для nginx для обработки.

Если не предотвращено http://nginx.org/r/proxy_ignore_headers et al, nginx выполняет специальную обработку X-Accel-Redirect заголовок ответа HTTP в верхнем потоке — он вызывает внутреннее перенаправление внутри nginx (что вы должны сделать с location отмечен internal директива, чтобы удостовериться, что единственный возможный способ получить доступ к таким файлам напрямую — исключительно через такой внутренний редирект).


Идея заключается в том, что ваш PHP-скрипт может по-прежнему обрабатывать аутентификацию и защиту от хотлинков любым способом, который вы сочтете необходимым — аутентификацию пользователя, срок действия ссылки, отдельные черные списки на основе AI и все — но затем в конце дня, как только скрипт будет выполнен фактическая подача файла клиенту будет осуществляться наиболее эффективным способом напрямую через nginx.

(Обратите внимание, что с помощью internal ключевое слово очень важно — оно гарантирует, что единственный способ возобновить загрузку, однажды прерванный по какой-либо причине, — это сначала связаться с вашим PHP-скриптом. Таким образом, с помощью этого хитрого и проверенного трюка из кулинарной книги nginx вы получите лучшее из обоих миров — полный контроль над горячими ссылками и наилучшее использование ресурсов.)

1

Другие решения

Вы должны прочитать файл по размеру буфера (например, 2 КБ), а затем отправить ответ, не отправлять весь ответ сразу, напишите сценарий, как показано ниже для загрузки файла:

    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);
1

Вы можете использовать .htaccess для этого.

Вы можете использовать это генератор или используйте следующий код и адаптируйте его самостоятельно.

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

location ~* \.(gif|png|jpe?g)$ {
expires 7d;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";

# prevent hotlink
valid_referers none blocked ~.google. ~.bing. ~.yahoo. server_names ~($host);
if ($invalid_referer) {
rewrite (.*) /static/images/hotlink-denied.jpg redirect;
# drop the 'redirect' flag for redirect without URL change (internal rewrite)
}
}

# stop hotlink loop
location = /static/images/hotlink-denied.jpg { }

Ссылка : http://nodotcom.org/nginx-image-hotlink-rewrite.html

0
По вопросам рекламы [email protected]