Я пытаюсь добавить в Google Analytics статистику, касающуюся прямого доступа к файлам mp3 (например, через iTunes) на этом сервере. Я хочу запустить эту функцию PHP и доставить файл, как будто не было перенаправления.
Эта часть mod_rewrite, кажется, работает нормально. Мои сценарии загрузки на месте и потоковый проигрыватель могут получать доступ к mp3-файлам, не вызывая правила.
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mysite\.com [NC]
RewriteRule ^audio/episodes/([^/\.]+).mp3$ /audio/episodes/google_analytics_mp3.php?mp3=$1&redirected=1 [L,QSA]
Однако моя первоначальная попытка доставки mp3 после запуска скрипта PHP не доставляет файл для прямого доступа. Просто белый экран в браузере и ошибка в iTunes.
if ($id = intval($_REQUEST['mp3'])) {
$e = new Episode;
list($ep) = $e->retrieve("id = $id");
if ($ep) {
ga_send_pageview(basename($ep->audio_link), $ep->google_title());
if ($_GET['redirected'] == 1) {
$fileLocation = '/'.$ep->audio_link;
header("Location: $fileLocation");
exit();
}
}
}
Также попробовал отправку header('Content-Type: audio/mpeg');
перед заголовком местоположения. Тот же результат.
Моя вторая попытка сделать браузер загрузкой файла в виде вложения, которое не будет работать для таких программ, как iTunes, и не является желаемым результатом.
if ($_GET['redirected'] == 1) {
$fileName = basename($ep->audio_link);
$fileLocation = $_SERVER['DOCUMENT_ROOT'].'/audio/episodes/'.$filename;
header("Content-Transfer-Encoding: binary");
header("Content-Type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3");
header('Content-length: ' . filesize($fileLocation));
header('Content-Disposition: attachment; filename="'.$fileName.'"');
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
readfile($fileLocation);
exit();
}
Обновить: Предложение Пера Мартина также попробовало этот второй подход, но с расположением, установленным в линию header('Content-Disposition: inline; filename="'.$fileName.'"');
но Chrome просто показывает белый экран. Если я отключу правило для удаления скрипта из уравнения, Chrome покажет родной mp3-плеер и воспроизводит файл.
Как я могу просто разрешить нормальный доступ к mp3-файлу после запуска скрипта PHP?
У меня ранее были проблемы с Content-length:
Вы можете попробовать закомментировать эту строку. Я думаю, что программа чтения файловой системы отличается от квантификатора размера файлов браузера, поэтому браузер ожидает (и получает) 99% файла, который, очевидно, затем является неполным, поэтому он не может вывести файл, поскольку он воспринимает его как неполные данные.
File System File Size as read !== browser file size
Однако я не уверен, почему это так.
Других решений пока нет …