Настройка apache для обслуживания PHP при запросе файла MP3
Я работаю над тем, чтобы подавать файлы MP3 через PHP и после некоторой помощи формировать массив SO, я получил его здесь
Однако этот пример не работает, когда я использую его как источник в звуковом тэге, подобном этому
<html>
<head>
<title>Audio Tag Experiment</title>
</head>
<body>
<audio id='audio-element' src="music/mp3.php" autoplay controls>
Your browser does not support the audio element.
</audio>
</body>
</html>
и здесь PHP
<?php
$track = "lilly.mp3";
if(file_exists($track))
{
header("Content-Transfer-Encoding: binary");
header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3");
header('Content-length: ' . filesize($track));
header('Content-Disposition: filename="lilly.mp3"');
header('X-Pad: avoid browser bug');
Header('Cache-Control: no-cache');
readfile($track);
}else{
echo "no file";
}
Итак, я думаю (и это может быть очень плохой идеей, скажите мне), что я мог бы настроить Apache для работы с PHP файлом, когда кто-то запрашивает .MP3.
Итак, у меня есть три вопроса
- Будет ли эта работа
- Хорошая идея/плохая идея?
- Что мне нужно делать? Помещает "AddType application/x-httpd-php.mp3" int he httpd conf сделать это?
Ответы
Ответ 1
В коде есть некоторые ошибки:
- У ресурса может быть только одно значение Content-Type. Поэтому вам нужно решить, какой тип носителя вы хотите использовать. Я предлагаю
audio/mpeg
.
- Вы забыли указать расположение в Content-Disposition. Если вы просто хотите указать имя файла и не хотите изменять расположение, используйте значение по умолчанию
inline
.
Остальное выглядит отлично. Но я бы также отправил код статуса 404, если файл не найден.
$track = "lilly.mp3";
if (file_exists($track)) {
header("Content-Type: audio/mpeg");
header('Content-Length: ' . filesize($track));
header('Content-Disposition: inline; filename="lilly.mp3"');
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
readfile($track);
exit;
} else {
header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404);
echo "no file";
}
Ответ 2
Вы могли бы просто сделать так, чтобы у вас было правило mod_rewrite для запуска каждого запроса на музыку /*. mp3 через ваш файл mp3.php.
Например, что-то вроде этого
RewriteEngine on
RewriteRule ^/music/(.*\.mp3) /music/mp3.php?file=$1 [L]
mp3.php может затем взять запрошенный файл из $_GET ['file'], но если вы пойдете с этим подходом, я рекомендую вам проверить работоспособность имени файла, чтобы убедиться, что он ссылается только на файл в нужной директории.
//ensure filename just uses alphanumerics and underscore
if (preg_match('/^[a-z0-9_]+\.mp3$/i', $_GET['file']))
{
//check file exists and serve it
$track=$_SERVER['DOCUMENT_ROOT'].'/music/'.$_GET['file'];
if(file_exists($track))
{
header("Content-Type: audio/mpeg");
header('Content-length: ' . filesize($track));
//insert any other required headers...
//send data
readfile($track);
}
else
{
//filename OK, but just not here
header("HTTP/1.0 404 Not Found");
}
}
else
{
//bad request
header("HTTP/1.0 400 Forbidden");
}
Ответ 3
Используйте файл заголовка x-send вместо файла readfile для лучшего выполнения.
http://john.guen.in/past/2007/4/17/send_files_faster_with_xsendfile/
Ответ 4
Это работает для меня (в .htaccess):
<FilesMatch "mp3$">
SetHandler application/x-httpd-php5
</FilesMatch>