HTTP缓存:为什么浏览器在假定缓存的文件是当前文件之前根本不检查服务器?

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

这是关于我继承的一些代码;意图是明确的,但(至少在Firefox和Chrome中)它的行为并没有达到预期的效果

这个想法显然是基于客户端数据构建一个PNG并缓存它,除非数据发生变化。其目的可能是,无论客户端是否使用cookie、本地存储等,都会保留PNG的状态,但同时服务器不会保留有关此客户端的数据

客户端JavaScript:

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中一直正常工作。我相信你所说的是解决方案的一部分,但显然这只是解决方案的一部分。谢谢。有问题的项目目前处于搁置状态,所以我现在不跟进。当然,只知道它为我以外的人修复了它-