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

在直接访问mp3文件之前运行PHP脚本,php,mod-rewrite,file-access,Php,Mod Rewrite,File Access,我正在尝试向Google Analytics添加有关此服务器上直接访问mp3文件(如通过iTunes)的统计数据。我想运行这个PHP函数并传递文件,就像没有重定向一样 其中的mod_重写部分似乎运行良好。我的现场下载脚本和流媒体播放器可以在不触发规则的情况下访问mp3文件 RewriteCond %{HTTP_REFERER} !^http://(www\.)?mysite\.com [NC] RewriteRule ^audio/episodes/([^/\.]+).mp3$ /audio/e

我正在尝试向Google Analytics添加有关此服务器上直接访问mp3文件(如通过iTunes)的统计数据。我想运行这个PHP函数并传递文件,就像没有重定向一样

其中的mod_重写部分似乎运行良好。我的现场下载脚本和流媒体播放器可以在不触发规则的情况下访问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();
        }
    }
}
还尝试发送
标题('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();
}
更新:根据Martin的建议,也尝试了第二种方法,但将处置设置为内联
标题('Content-disposition:inline;filename=“.”$filename.”)但Chrome只显示白色屏幕。若我禁用规则从公式中删除脚本,Chrome将显示本机mp3播放器和播放文件


PHP脚本运行后,我如何允许正常访问mp3文件?

我以前遇到过
内容长度的问题:
,您可以尝试注释这一行。我认为文件系统文件大小读取器不同于浏览器文件大小量词,因此浏览器需要(并获得)99%的文件,而这些文件显然是不完整的,因此它无法输出文件,因为它认为文件是不完整的数据

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

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

利用cookie。尝试
内容配置:inline
将Mp3直接加载到浏览器或iTunes中,而不是强制下载。@Martin采用哪种方法?使用位置标题还是第二种方法?我知道ITunes正在调用您的脚本,但无法加载您的mp3?我的想法是,由于数据被设置为附件,这将与ITunes的预期相冲突?明白了。我刚刚尝试将附件更改为内联`header('Content-Disposition:attachment;filename=“.$filename.'”);`而浏览器对直接访问的响应是相同的——白色屏幕。一旦规则被禁用,在Chrome的本机播放器中从中间的mp3播放中取出脚本。@jerrygarciuh作为附加编辑: