Пытаюсь реализовать раздачу файлов из защищённой папки средствами apache по внутреннему запросу через скрипт на php. Nginx использовать не могу по обстоятельствам заказчика. В nginx есть удобное решение моей задачи:
location /dir{
internal;
mp3;
}
Как это можно сделать на apache?
.htaccess:
RewriteEngine On
RewriteBase /
RewriteRule ^content/audio/(.*)?$ audio.php?s=%{IS_SUBREQ}&q=$0 [NS]
audio.php
$q =explode('/', $_GET['q']);
$filename = $q[3];
$file = 'audio/'.$filename;
function file_transfer($file) {
if (file_exists($file)) {
if (ob_get_level()) {
ob_end_clean();
}
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
if ($fd = fopen($file, 'rb')) {
while (!feof($fd)) {
print fread($fd, 1024);
}
fclose($fd);
}
exit;
}else{
echo 'error';
}
}
file_transfer($file);
В плеер подаётся ссылка вида http://domen.ru/content/audio/ffjhgdgg687/song.mp3 По идее название файла надо заменить на id и путь рать из базы, но это детали.
Надо, сделать так, чтоб при переходе по прямой (несуществующей) ссылке скрипт audio.php возвращал ошибку, а при запросе через плеер отдавал файл.
Помогло добавление файла .htacess в папку audio c кодом
<FilesMatch "\.(mp3)$">
Require all denied
</FilesMatch>
По реальному пути http://domen.ru/audio/song.mp3 файл недоступен. Правда осталось придумать, как сделать, чтобы по пути http://domen.ru/content/audio/ffjhgdgg687/song.mp3 файл отдавался только плееру.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости