@demonicq2014, а что мешает использовать ссылки, которые живут непродолжительное время?
Самый простой вариант - все ссылки ведут на один файл. С запросом передаете токен запроса, по этому токену файл определяет, какое видео надо показывать, и редиректит на символьную ссылку на нужное видео. Эту символьную ссылку потом можно удалить.
Люди, это правда был комментарий, т.к. мне надо было через несколько минут уходить. Когда освободился бы, я бы дал уже развернутый ответ
Приведу простой пример (мы использовали аналогичную схему, правда проект долго не продержался, поэтому не могу сказать насколько удачным оказалось решение, но начальную нагрузку выдерживало):
Храним исходное видео в недоступном для пользователя месте (например, /opt/video/). Каждому видео даем некоторый ID, которое и будет его именем (для простоты, можно использовать и произвольное имя, если по ID видео потом получать его оригинальное название), например, 1.mp4, 1.ogg, 1.webm (различные форматы для нормального отображения в разных браузерах)
Каждое видео может быть получено обращением к одному адресу с указанием необходимых параметров (токен, ID видео и т.д.)
Когда пользователь заходит на сайт, даем ему некоторый токен. Далее по этому токену определяем возможность просмотра видео пользователем. Не забудьте только удалять истекшие токены (иначе, получив однажды ссылку можно будет пользоваться ею вечно)
Поскольку видео изначально недоступно для пользователя, то надо предоставить пользователю доступ к данному видео (в нашем случае - символьную ссылку)
Кроме того, мы не знаем, сколько еще будет действовать токен, поэтому надо периодически удалять устаревшие ссылки. Удалять символьные ссылки еще надо и потому, что момент редиректа может быть легко отслежен и поэтому пользователь получит оригинальную ссылку.
На самом деле, когда я тестировал этот подход, то заметил: файл уже можно удалять через пару секунд после начала просмотра видео - видео будет проигрываться без проблем. Т.е. в момент создания символьной ссылки можно запустить задачу, которая через некоторое время удалит созданный файл.
Теперь примеры:
index.php:
$token = ...
$videoId = ...
if (!checkToken($token)) {
return;
}
$filename = generateRandomFilename();
$originalVideo = "/opt/poker/{$videoId}.mp4";
$symlinkVideo = "/var/www/video/{$filename}.mp4";
$lifetime = 10;
$command = "/opt/symlink.sh {$originalVideo} {$symlinkVideo} $lifetime > /dev/null";
exec($command, $output, $status);
header("Location: http://mysite.com/video/{$filename}.mp4");
symlink.sh:
#!/bin/bash
ln -s -T $1 $2
./remove_symlink.sh $2 $3 > /dev/null &
remove_symlink.sh:
#!/bin/bash
sleep $2
rm $1
Не забывайте, что это только пример. Вместо remove_symlink.sh можно (возможно даже лучше) использовать очереди сообщений - поместили файл в очередь на удаление, а специальная периодическая задача уже удаляет его. Так же через параметры стоит передавать формат файла и его качество (для успешного воспроизведения на большинстве устройств)
Вместо токена можно использовать саму ссылку. Т.е. генерируем случайную ссылку (что-то типа http://mysite.com/video/generated-random-string), сохраняем в базу время ее действия, какой файл надо показать и т.д. Потом по этой ссылке достаем полученную информацию и продолжаем работу.
В итоге: даже если пользователь увидел ссылку на видео (на index.php или на симлинк), то через некоторое время ни одна из ссылок не будет доступной.
Но, еще раз, это не защита от скачивания, это защита от встраивания - делиться ссылкой на видео или вставлять ее в свой сайт у других не получится. Но они могут записать/сохранить видео и пользоваться уже этой копией.