在直接访问mp3文件之前运行PHP脚本

时间:2016-12-13 16:40:01

标签: php mod-rewrite file-access

我正在尝试向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]

然而,在PHP脚本运行后我最初尝试提供mp3并不能提供直接访问的文件。只是浏览器中的白屏和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();
}

更新:Per Martin的建议也尝试了第二种方法,但将处置设置为内联header('Content-Disposition: inline; filename="'.$fileName.'"');,但Chrome只显示白屏。如果我禁用规则从等式中删除脚本Chrome将显示原生mp3播放器和播放文件。

如何在PHP脚本运行后简单地允许正常访问mp3文件?

1 个答案:

答案 0 :(得分:1)

我之前遇到Content-length:的问题,您可以尝试评论此行。我认为文件系统文件大小读取器与浏览器文件大小量化器不同,因此浏览器期望(并获得)99%的文件,这显然是不完整的,因此它无法输出文件,因为它将其视为不完整的数据。

File System File Size as read !== browser file size 

但是我不确定为什么会这样。