如何禁用包含HTML内容的PHP文件的浏览器缓存?
问题描述
我通过PHP生成HTML页面,PHP脚本可正常修改语音文件,但播放修改后的文件时,浏览器始终播放旧的缓存版本,而非新修改的文件。
我的PHP脚本分为两部分:开头是PHP逻辑代码,末尾是HTML页面代码。
已尝试的解决方案
- 先在HTML中添加缓存禁用meta标签:
<meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" /> <meta http-equiv="Cache-Control" content="no-store, no-cache, max-age=0, must-revalidate, proxy-revalidate" />
该方案无效,了解到多数浏览器会忽略这类meta标签后,又在PHP代码开头添加HTTP缓存头:
<?php header('Cache-Control: no-cache, no-store, must-revalidate'); header('Pragma: no-cache'); header('Expires: 0'); header('Date: Tue, 03 Apr 2018 19:03:12 GMT'); ?>
通过浏览器Network标签确认这些header已成功发送,但客户端仍播放缓存的MP3文件。
补充说明:我通过img标签的data-music属性引用音频文件,代码如下:
<div class="col-1 px-0 mx-0"> <img src="/typo3conf/ext/album/Resources/Public/Icons/Speaker_Icon.svg" height="20" title="Hörprobe 15s" class="aSpeaker" data-music="https://www.country-radio.eu/fileadmin/Radio/Voice/TTS/Hans-Georg_Althoff_HGA_1.mp3"> </div>
解决方案
问题核心是:你设置的是HTML页面的缓存禁用规则,但浏览器缓存的是MP3音频文件本身,二者的缓存策略相互独立。以下是几种有效解决办法:
方法1:给MP3 URL添加动态参数(推荐)
每次文件修改后,在URL末尾添加唯一标识(比如文件修改时间戳、随机数),让浏览器判定这是新资源,从而重新请求:
<?php // 获取音频文件的服务器物理路径与修改时间戳 $audioServerPath = $_SERVER['DOCUMENT_ROOT'] . '/fileadmin/Radio/Voice/TTS/Hans-Georg_Althoff_HGA_1.mp3'; $fileModifyTime = filemtime($audioServerPath); // 拼接带时间戳参数的音频URL $audioUrl = 'https://www.country-radio.eu/fileadmin/Radio/Voice/TTS/Hans-Georg_Althoff_HGA_1.mp3?v=' . $fileModifyTime; ?> <!-- 在HTML中输出带参数的URL --> <div class="col-1 px-0 mx-0"> <img src="/typo3conf/ext/album/Resources/Public/Icons/Speaker_Icon.svg" height="20" title="Hörprobe 15s" class="aSpeaker" data-music="<?php echo $audioUrl; ?>"> </div>
文件修改后,v参数会自动更新,浏览器会主动下载新的音频文件。
方法2:配置服务器禁用MP3缓存
如果是Apache服务器,在项目根目录的.htaccess文件中添加规则:
<FilesMatch "\.(mp3)$"> Header set Cache-Control "no-cache, no-store, must-revalidate" Header set Pragma "no-cache" Header set Expires 0 </FilesMatch>
如果是Nginx服务器,在站点配置中添加:
location ~* \.mp3$ { add_header Cache-Control "no-cache, no-store, must-revalidate"; add_header Pragma "no-cache"; add_header Expires 0; }
该方法会让所有MP3文件都不被缓存,适合频繁修改音频的场景,但可能影响整体加载性能。
方法3:修改音频文件名
每次修改音频后,直接更新文件名(比如添加版本号:Hans-Georg_Althoff_HGA_1_v2.mp3),同时同步修改HTML中data-music的URL。这种方式直观但需要手动维护文件名版本,适合修改频率较低的场景。
内容的提问来源于stack exchange,提问作者Georgio
相关产品推荐
相关产品推荐

