在php中,重新上载具有相同文件名的图像时,如何清除浏览器缓存?

在php中,重新上载具有相同文件名的图像时,如何清除浏览器缓存?,php,browser-cache,Php,Browser Cache,我有一个项目列表,其中还包含一个图像缩略图。有时我需要更改缩略图,但保持文件名不变。有没有办法强迫浏览器下载新上传的图像,而不是从浏览器缓存中获取图像 当人们更新他们的头像时,这一点非常重要,这会导致一些用户感到困惑,他们会一直看到他们的旧头像,直到清除浏览器缓存或重新启动浏览器 您可以通过更改以下选项使整个页面的缓存无效: 发送图像时,确保不发送任何过期的标题。还考虑发送这个缓存头: Cache-Control: must-revalidate 这将使浏览器每次都向服务器请求图像。注意请求中

我有一个项目列表,其中还包含一个图像缩略图。有时我需要更改缩略图,但保持文件名不变。有没有办法强迫浏览器下载新上传的图像,而不是从浏览器缓存中获取图像


当人们更新他们的头像时,这一点非常重要,这会导致一些用户感到困惑,他们会一直看到他们的旧头像,直到清除浏览器缓存或重新启动浏览器

您可以通过更改以下选项使整个页面的缓存无效:


发送图像时,确保不发送任何过期的
标题。还考虑发送这个缓存头:

Cache-Control: must-revalidate
这将使浏览器每次都向服务器请求图像。注意请求中的If-Modified-Since头;如果未修改图像,请使用304 HTTP代码回答

整个过程(必须重新验证,如果从304年起修改,则为304年应答)将使浏览器能够缓存图像内容,但同时询问服务器文件是否已更改



另一个可能更简单的解决方案是,只将
过期
标题设置为未来的短时间,例如十分钟,并通知用户十分钟延迟。这将加快大多数页面加载速度,因为根本不需要对图像执行任何HTTP请求。

您可以使用文件的修改时间:

<?

$filename = 'avatar.jpg';
$filemtime = filemtime($filename);

echo "<img src='".$filename."?".$filemtime."'>";

//result: <img src='avatar.jpg?1269538749'>

?>


修改文件时,将清除客户端缓存

在图像src的末尾追加一个唯一的数字


手动页面刷新时缓存的图像也会失效(在浏览器中按F5)。这可以通过Javascript方法location.reload()在主体加载时激发来模拟。为避免永久重新加载,此操作只能发生一次。当用户上传一个新的化身时,在他/她的会话中持续设置重新加载挂起请求,并在其被应答时重置

<?php
if ($session['ReloadPending']) 
{   $session['ReloadPending']=false; 
       echo "<body onload='location.reload(true);'>"; 
} else echo "<body>";
?>

我发现最好的方法之一是使用相同的URL获取和发布图像(REST)

POST/my/image(缓存控制:无缓存,必须重新验证)

获取/my/image(缓存控制:必须重新验证)


请在
.htaccess
文件中使用这些规则。 我使用了这些规则,解决了用相同文件名重新上传图像的问题

# BEGIN Caching
<ifModule mod_headers.c>
    <filesMatch "\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|ttf|otf|woff|woff2|eot|svg)$">
        Header set Cache-Control "max-age=0, public"
    </filesMatch>
    <filesMatch "\\.(css)$">
            Header set Cache-Control "max-age=604800, public"
    </filesMatch>
    <filesMatch "\\.(js)$">
        Header set Cache-Control "max-age=216000, private"
    </filesMatch>
    <filesMatch "\\.(xml|txt)$">
        Header set Cache-Control "max-age=216000, public, must-revalidate"
    </filesMatch>
    <filesMatch "\\.(html|htm|php)$">
        Header set Cache-Control "max-age=1, private, must-revalidate"
    </filesMatch>
</ifModule>
# END Caching
#开始缓存
标头集缓存控制“最大年龄=0,公共”
标题集缓存控制“最大年龄=604800,公共”
标题集缓存控制“最大年龄=216000,专用”
标题集缓存控制“最大年龄=216000,公共,必须重新验证”
标题集缓存控制“最大年龄=1,私有,必须重新验证”
#端缓存

您可以将上次修改的日期添加到图像中,或者只需在图像末尾添加日期和时间
URL

比如说

$today=date('Y-m-d H:i');

<img class="img-circle pro_pic" src="https://govcard.net/yourimage.jpg?lm=<?php echo $today?>" alt=""> 
$today=日期('Y-m-d H:i');
“alt=”“>

在.jpg之后添加这样的日期和时间。希望这能对您有所帮助。

不幸的是,这会使文件的缓存变得不可能,增加页面加载时间和带宽成本。然后只在上传后才执行此操作?我们可以只对一个图像执行此操作,而不是整个应用程序吗?在许多情况下,由于HTML代码的缓存性质,这是不可能的ache生成的HTML代码进入数据库,每隔几天更新一次。这太棒了。你应该想到+1“发送图像时”是什么意思?在我上传图像后,使用标题(“Location:whatever.php”);?不,我的意思是当有人请求图像文件时,例如,对/example/image.jpgNote执行HTTP请求,计算md5需要大量的处理能力。最好使用
filemtime()
。不,使用Google Chrome不起作用。更新:页面在缓存中,它起作用了!谢谢!
<?php
if ($session['ReloadPending']) 
{   $session['ReloadPending']=false; 
       echo "<body onload='location.reload(true);'>"; 
} else echo "<body>";
?>
# BEGIN Caching
<ifModule mod_headers.c>
    <filesMatch "\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|ttf|otf|woff|woff2|eot|svg)$">
        Header set Cache-Control "max-age=0, public"
    </filesMatch>
    <filesMatch "\\.(css)$">
            Header set Cache-Control "max-age=604800, public"
    </filesMatch>
    <filesMatch "\\.(js)$">
        Header set Cache-Control "max-age=216000, private"
    </filesMatch>
    <filesMatch "\\.(xml|txt)$">
        Header set Cache-Control "max-age=216000, public, must-revalidate"
    </filesMatch>
    <filesMatch "\\.(html|htm|php)$">
        Header set Cache-Control "max-age=1, private, must-revalidate"
    </filesMatch>
</ifModule>
# END Caching
$today=date('Y-m-d H:i');

<img class="img-circle pro_pic" src="https://govcard.net/yourimage.jpg?lm=<?php echo $today?>" alt="">