Настройка nginx для отдачи больших файлов.

123
M
На сайте с 17.09.2016
Offline
135
#11
iccup #:

Ну, и скрипт для удаления -

Зачем так сложно то?

Если цель контролировать/скрыть реальный адрес файла, то nginx понимает заголовок  X-Accel-Redirect c помощью которого можно скрыто перенаправить скачивание на реальный адрес файла

Реальный адрес файла закрываем опцией internal, и по прямой ссылке будет ошибка 404

https://nginx.org/ru/docs/http/ngx_http_core_module.html#internal

LEOnidUKG
На сайте с 25.11.2006
Offline
1773
#12

Поправьте меня конечно:

Реальный адрес файла закрываем опцией internal, и по прямой ссылке будет ошибка 404

И какой смысл? Суть то в том, чтобы файлы вообще были доступны временно для всех. Мы тут не меняем одно название файла на другое.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
M
На сайте с 17.09.2016
Offline
135
#13
LEOnidUKG #:

Поправьте меня конечно:

И какой смысл? Суть то в том, чтобы файлы вообще были доступны временно для всех. Мы тут не меняем 1 название файла на другое.

Хотите постоянную ссылку - пожалуйста

/down.php?id=1

А скрипт уже через заголовок редиректит на /data/files.zip к примеру

По прямому адресу  /data/files.zip - доступа не будет, только через down.php

LEOnidUKG
На сайте с 25.11.2006
Offline
1773
#14
Mobiaaa #:

Хотите постоянную ссылку - пожалуйста

/down.php?id=1

А скрипт уже через заголовок редиректит на /data/files.zip к примеру

По прямому адресу  /data/files.zip - доступа не будет, только через down.php

Ссылка должна привязана быть к пользователю. Это защита, чтобы не делились ссылками.

Через час ссылка умирает и пока физически человек её не запросит, файл не будет доступен.

M
На сайте с 17.09.2016
Offline
135
#15
LEOnidUKG #:

Ссылка должна привязана быть к пользователю. Это защита, чтобы не делились ссылками.

Через час ссылка умирает и пока физически человек её не запросит, файл не будет доступен.

Без проблем

Пишем в базу ключ=>имя файла

down.php?hash=какой-то_одноразовый_ключ

Через час с базы удаляем

По Вашему же примеру, можно в момент старта скачивания продлевать таймер на час

Можно к IP привязать скачивание, хоть к времени суток или фазе луны

К авторизации на сайте тоже можно привязаться

На что фантазии хватит

в файловую систему вообще не лезем, и через php файлы не отдаём

LEOnidUKG
На сайте с 25.11.2006
Offline
1773
#16
Mobiaaa #:

На что фантазии хватит

в файловую систему вообще не лезем, и через php файлы не отдаём

Да, тут вообще у нас любые фантазии приветствуются. Я предложил пример в лоб, который вполне понятен, и его реализация проста и прозрачна.

На nginx можно реализовать одноразовые ключи, вот статья: https://habr.com/ru/articles/346758/

После прочтения сжечь. Делаем одноразовые ссылки на голом Nginx
После прочтения сжечь. Делаем одноразовые ссылки на голом Nginx
  • 2018.01.16
  • habr.com
Для начала нужно уточнить, что я настоятельно не рекомендую использовать это решение в боевых условиях. Лучше вовсе так не делать никогда. Всё, что вы делаете, вы делаете на свой страх и риск. Причины, которые заставляют дать такой совет, будут приведены в содержании статьи. Если это предупреждение вас не отпугнуло, то добро пожаловать под кат...
iccup
На сайте с 01.05.2016
Offline
205
#17

В общем долго я бодался с ним, не все и не сразу получалось. Однако, он понимает меня куда быстрее чем остальные прогеры. В итоге, я получил рабочий вариант -

<?php
$allowedReferer = 'https://domain.com/'; // Замените на адрес вашего сайта
$referer = $_SERVER['HTTP_REFERER'] ?? '';

if (strpos($referer, $allowedReferer) !== 0) {
    // Если реферер не ваш сайт, выводим ошибку и прекращаем выполнение скрипта
    header('HTTP/1.0 403 Forbidden');
    exit('Direct access not allowed.');
}

// Путь к директории для сохранения временных файлов (относительный путь)
$tempDir = 'videostmp/';

// Путь к оригинальному файлу (относительный путь)
$originalFilePath = 'videos/' . $_GET['file'];

// Абсолютный путь к директории временных файлов
$tempDirAbsPath = __DIR__ . '/' . $tempDir;

// Создание директории для временных файлов, если она не существует
if (!is_dir($tempDirAbsPath)) {
    mkdir($tempDirAbsPath, 0755, true);
}

// Получение расширения оригинального файла
$originalExtension = pathinfo($originalFilePath, PATHINFO_EXTENSION);

// Хэш оригинального файла
$originalFileHash = md5_file($originalFilePath);

// Генерация уникального имени файла с расширением, используя хэш оригинального файла
$tempFileName = $originalFileHash . '.' . $originalExtension;
$tempFilePath = $tempDirAbsPath . $tempFileName;

// Проверяем наличие временного файла
if (!file_exists($tempFilePath)) {
    // Копируем оригинальный файл во временную директорию
    if (copy($originalFilePath, $tempFilePath)) {
        // Установка прав доступа для временного файла
        chmod($tempFilePath, 0644);
    } else {
        // Обработка ошибки создания временного файла
        echo 'Error creating temporary file.';
        exit;
    }
}

// Обновляем время последнего доступа к файлу
touch($tempFilePath);

// Выводим прямую ссылку на временный файл
$tempFileLink = $tempDir . $tempFileName;
echo 'Download link: <a download href="' . $tempFileLink . '">Download</a>';

?>

Скрипт для удаления устаревших файлов -

<?php
$tempDir = 'videostmp/';
$tempDirAbsPath = __DIR__ . '/' . $tempDir;
$maxLifetime = 3600; // Время жизни файла в секундах (в данном примере - 1 час)

// Получаем список файлов в директории
$files = glob($tempDirAbsPath . '*');

// Проходимся по каждому файлу и проверяем время последнего доступа
foreach ($files as $file) {
    // Получаем время последнего доступа к файлу
    $lastAccessTime = fileatime($file);
    
    // Вычисляем время, прошедшее с последнего доступа к файлу
    $elapsedTime = time() - $lastAccessTime;
    
    // Если прошло больше времени, чем заданное в $maxLifetime, удаляем файл
    if ($elapsedTime >= $maxLifetime) {
        unlink($file);
    }
}
?>

Крон на выполнение скрипта по удалению устаревших файлов -

0 * * * * php /var/www/user/data/www/domain.com/deleteoldtmp.php
kimsufi.com ( https://www.kimsufi.com ) очень дешевые и качественные дедики https://clck.ru/gvF9p - антибот, использую уже 3 года.
VG
На сайте с 30.04.2017
Offline
86
#18
Mobiaaa #:

Зачем так сложно то?

Если цель контролировать/скрыть реальный адрес файла, то nginx понимает заголовок  X-Accel-Redirect c помощью которого можно скрыто перенаправить скачивание на реальный адрес файла

Реальный адрес файла закрываем опцией internal, и по прямой ссылке будет ошибка 404

https://nginx.org/ru/docs/http/ngx_http_core_module.html#internal

не подскажите на apache такое можно делать?

lutskboy
На сайте с 22.11.2013
Offline
192
#19
VadimGen #:
не подскажите на apache такое можно делать?

да.  MOD_X_SENDFILE .но лучше нгинх

LEOnidUKG
На сайте с 25.11.2006
Offline
1773
#20

Кстати, чтобы файлы туда сюда не перемещать, PHP всё же умеет в символические ссылки: https://www.php.net/manual/ru/function.symlink.php

Поэтому без проблем можно не файлы копировать, а просто ссылки на них создавать.

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий