Я скрываю URL-адрес HLS, используя PHP для вывода файлов, но не работает

Это мой оригинальный URL: http://xxx.xxx.xxx.xxx/01/MV01/index.m3u8 Из соображений безопасности я переместил все файлы HLS за пределы корня документа веб-сайта (/var/www/html). IE. переместите их в /var/www/video/01/MV01/index.m3u8, включая все файлы .ts в той же папке.

А затем я создал .htaccess в корне документа:

.htaccess:

RewriteEngine on
RewriteCond %{REQUEST_URI} .*ts$|.*m3u8$ [NC]
RewriteRule ^(.*) auth.php?file=$1 [NC,L]

Это перенаправит все требования и получит файлы, выводимые php.

авторизация.php:

//
Some codes to check authorization first.
//
$reqpath = strip_tags($_GET['file']);
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache,must-revalidate");
header("Cache-Control: post-check=0, pre-check=0",false);
header("Pragma: no-cache");
header('Content-type:application/force-download');
if (strpos($_GET['file'],".ts")>1) header("Content-type: video/MP2T");
if (strpos($_GET['file'],".m3u8")>1) header("Content-type: application/x-mpegURL");
@readfile("/var/www/video/".$reqpath);

Моя цель - когда пользователь обращается к http://xxx.xxx.xxx.xxx/01/MV01/index.m3u8 он все еще может воспроизводить видео.

Результат: он хорошо работает на iOS и Android, но не может воспроизводиться на ПК, включая jwplayer и VLC.

Сообщение об ошибке на jwplayer: «Ошибка загрузки проигрывателя: воспроизводимые источники не найдены». Сообщение об ошибке на VLC: «основная ошибка ввода: нет подходящего модуля демультиплексора для 'http://xxx.xxx.xxx.xxx/01/MV01/index.m3u8'

** Я использую образцы файлов HLS, загруженные с сайта apple.com, поэтому я думаю, что файлы .m3u8 и .ts не проблема.

Помощь!


person Bunong    schedule 15.08.2014    source источник
comment
auth.php?file=../../../etc/passwd   -  person tlenss    schedule 15.08.2014
comment
Конечно, я предотвратил это и буду делать больше ограничений. Спасибо за напоминание.   -  person Bunong    schedule 15.08.2014


Ответы (1)


Я решил это, наконец.

Почему можно играть только на iOS и Android, но не на ПК? Я предполагаю, что проблема должна быть в выводе в PHP, поэтому я попытался изменить заголовок HTTP, а затем нашел ответ.

Просто добавьте еще один заголовок:

header('Content-Length: ' . filesize("/var/www/video/".$reqpath));

Весь заголовок здесь

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache,must-revalidate");
header("Cache-Control: post-check=0, pre-check=0",false);
header("Pragma: no-cache");
header('Content-type:application/force-download');
header('Content-Disposition: attachment; filename='.basename($filename));
header('Content-Length: ' . filesize("/var/www/video/".$reqpath));
header('Content-Type: '.mime_content_type("/var/www/video/".$reqpath));

Надеюсь, это поможет кому-то.

person Bunong    schedule 19.08.2014
comment
Большое спасибо. Я не уверен, что вы все еще здесь, но это именно то, что мне было нужно и сэкономило мне много времени. - person user3931836; 29.05.2021