You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用包含HTML内容的PHP文件的浏览器缓存?

问题描述

我通过PHP生成HTML页面,PHP脚本可正常修改语音文件,但播放修改后的文件时,浏览器始终播放旧的缓存版本,而非新修改的文件。

我的PHP脚本分为两部分:开头是PHP逻辑代码,末尾是HTML页面代码。

已尝试的解决方案

  1. 先在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:00:57