Настройка 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.

Итак, у меня три вопроса

  1. Будет ли эта работа
  2. Хорошая идея / плохая идея?
  3. Что мне нужно сделать? Помещает «AddType application / x-httpd-php .mp3» int he httpd conf сделать это?

Solutions Collecting From Web of "Настройка apache для обслуживания PHP при запросе файла MP3"

В вашем коде есть некоторые ошибки:

  • Ресурс может иметь только одно значение 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"; } 

Вы могли бы просто сделать так, чтобы у вас было правило 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"); } 

Используйте файл заголовка x-send вместо файла readfile для лучшего выполнения.

http://john.guen.in/past/2007/4/17/send_files_faster_with_xsendfile/

Это работает для меня (в .htaccess):

 <FilesMatch "mp3$"> SetHandler application/x-httpd-php5 </FilesMatch>