PHP:如何强制浏览器在每次页面加载时直接从服务器提取图像


PHP: How to force browser to pull an image directly from the server on every pageload?

基本上,我有一个页面,用户可以上传他们的个人资料照片。但是,如果它们替换当前的,在新的覆盖旧的之后,旧的仍然出现在页面重新加载后,因为可能是因为旧的被缓存了。

在PHP中,我尝试使用:

header("Cache-Control: no-cache, must-revalidate");
header("Expires: -1");

但它不工作(至少)在谷歌浏览器。

我能做些什么,这样当我重新加载页面后,图片上传,它强制浏览器总是从服务器拉文件,所以它拉最新的一个?

谢谢!

我建议您在image-url中添加一些$_GET -参数,如下所示:

profile_user{user_id}.(jpg|png)?v={date('Ymdhis)}(注:伪)

上面的结构w可以产生以下链接:

profile_user001.png?v=20110804191700

新的链接=浏览器必须获取一个新的图像=胜利

只要你关心用HTTP头控制缓存,你就必须看看客户端是使用HTTP 1.1还是HTTP 1.0,以及两者之间是否有代理。

一般来说,指定一个资源不应该被缓存,你可以考虑以下头:

header("Pragma: no-cache"); # HTTP 1.0
header("Cache-Control: no-cache"); # HTTP 1.1
header("Expires: Thu, 01 Dec 1994 16:00:00 GMT");
 # With the two above, the last is not strictly necessary. Prefer a HTTP date in 
 # the past instead of -1 -OR- prefer 0 as it is specified how to deal with it.

可以缓存什么以及如何缓存,请参见 13.4响应可缓存性,具体的报头请参见超文本传输协议—HTTP/1.1第14节报头字段定义

设置正确的标题并不意味着你实际上完全控制了浏览器的缓存。唯一能够做到这一点的是运行客户端的用户。任何客户端都可以配置为忽略这些标头并立即缓存。例如,预取内容,等等。

你唯一能做的就是改变资源的URI(在你的例子中是头像)。例如,每次用户更改她的个人资料图片时,您可以计算一个修订计数器并将其附加到URI。这样做将确保当浏览器请求修改后的个人资料图片位置时,将显示正确的图像。

如果请求旧版本,则必须重定向到最新版本。重定向响应通常不被缓存。

使用修订将有助于用户代理仍然缓存图片(这对您的带宽和页面性能很好),同时他们总是会显示最新的修订。

您需要为图像文件本身发送无缓存头,而不是PHP脚本。如果你禁用缓存,你的网站性能将会很差,用户将不得不在每次请求时下载图像。

标准做法是,如果图像被替换,则使用新文件名,或者至少在其名称后面附加某种版本。如image.jpg ? v = xxx .