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