HTTP缓存:为什么浏览器在假定缓存的文件是当前文件之前根本不检查服务器?
这是关于我继承的一些代码;意图是明确的,但(至少在Firefox和Chrome中)它的行为并没有达到预期的效果 这个想法显然是基于客户端数据构建一个PNG并缓存它,除非数据发生变化。其目的可能是,无论客户端是否使用cookie、本地存储等,都会保留PNG的状态,但同时服务器不会保留有关此客户端的数据 客户端JavaScript:HTTP缓存:为什么浏览器在假定缓存的文件是当前文件之前根本不检查服务器?,http,google-chrome,firefox,caching,http-headers,Http,Google Chrome,Firefox,Caching,Http Headers,这是关于我继承的一些代码;意图是明确的,但(至少在Firefox和Chrome中)它的行为并没有达到预期的效果 这个想法显然是基于客户端数据构建一个PNG并缓存它,除非数据发生变化。其目的可能是,无论客户端是否使用cookie、本地存储等,都会保留PNG的状态,但同时服务器不会保留有关此客户端的数据 客户端JavaScript: function read_or_write_png(name, value) { // WRITE if value is defined, non-null
function read_or_write_png(name, value) {
// WRITE if value is defined, non-null, etc., get otherwise
if (value) {
// WRITE
// Use cookie to convey new data to server
document.cookie = 'bx_png=' + value + '; path=/';
// bx_png.php generates the image
// based off of the http cookie and returns it cached
var img = new Image();
img.style.visibility = 'hidden';
img.style.position = 'absolute';
img.src = 'bx_png.php?name=' + name; // the magic saying "load this".
// 'name' is not consulted server-side,
// it's here just to get uniqueness
// for what is cached.
} else {
// READ
// Kill cookie so server should send a 304 header
document.cookie = 'bx_png=; expires=Mon, 20 Sep 2010 00:00:00 UTC; path=/';
// load the cached .png
var img = new Image();
img.style.visibility = 'hidden';
img.style.position = 'absolute';
img.src = 'bx_png.php?name=' + name;
}
}
bx_png.PHP中的服务器端PHP:
if (!array_key_exists('bx_png', $_COOKIE) || !isset($_COOKIE['bx_png'])) {
// we don't have a cookie. Client side code does this on purpose. Force cache.
header("HTTP/1.1 304 Not Modified");
} else {
header('Content-Type: image/png');
header('Last-Modified: Wed, 30 Jun 2010 21:36:48 GMT');
header('Expires: Tue, 31 Dec 2030 23:30:45 GMT');
header('Cache-Control: private, max-age=630720000');
// followed by the content of the PNG
}
第一次写入PNG并缓存它很好,但是很明显,目的是能够再次调用它,为相同的名称传递不同的值,并缓存它。实际上,一旦缓存了PNG,就会(通过Fiddler)显示根本没有调用服务器。也就是说,在尝试读取时,浏览器只从缓存中获取内容,而不与服务器进行通信,而不是转到服务器并获取返回的内容。就其本身而言,这一部分是无害的,但当然有害的是,在尝试写入时也会发生同样的事情,服务器永远没有机会根据新值发回不同的PNG
有人知道如何调整它以实现其明显的意图吗?也许标题有点不一样?也许是某种从客户端清除缓存的方法?也许是我完全没有想到的其他事情?在服务器端和客户端方面,我都是一个非常可靠的开发人员,但是对于HTTP协议这样的诡计,经验较少。您需要将
添加到缓存控件
头中,然后重新验证以告诉浏览器这样做。尝试缓存控件:无存储
,因为它在Safari/WebKit中为我解决了同样的问题。(我想Chrome在你提问后的时间内解决了这个问题。)
这仍然是一个问题,但是他们为这个标题添加了一个补丁。听起来很有道理,我会试试。是的。完美的谢谢嗯,嗯。在Firefox中是完美的,这至少是朝着正确方向迈出的一大步。谢谢不过,在Chrome中仍然不起作用。我会调查的。我应该把Chrome部分作为一个单独的问题来问,还是只把它打开?经过更广泛的实验后,它甚至不能在Firefox中一直正常工作。我相信你所说的是解决方案的一部分,但显然这只是解决方案的一部分。谢谢。有问题的项目目前处于搁置状态,所以我现在不跟进。当然,只知道它为我以外的人修复了它-