使缓存的内容无效,If-Modified Headers?

时间:2009-08-18 17:36:26

标签: php jquery ajax caching header

我有一个特殊的问题:

PHP SCRIPT:

// checks If-Modified-Since header (if nothing has changed)
// Sends HTTP/1.0 304 Not Modified
// Sends Cache-control: public, must-revalidate
// exits

// if NO If-Modified-Since or something has changed
// builds content
// Sends Last-Modified: [DATE TIME]
// Sends Cache-control: public, must-revalidate
// exits

我正在使用jQuery AJAX尝试按需刷新内容,我试图通过使用“beforeSend”参数更改过去的DATE TIME的If-Modified-Since标头来实现此目的。

目前正在发生这种情况:

  1. 提出请求,200 OK响应新鲜内容
  2. 后续请求获得304响应,浏览器从缓存中获取
  3. 服务器上的内容已更改
  4. 使用修改后的If-Modified-Since标头(无URL字符串更改)发出请求,200 OK响应新内容
  5. 后续请求(不改变If-Modified-Since标头)似乎从第1步检索旧内容
  6. 我想我的印象是,在第4步,浏览器内容应该已刷新,我缺少什么?

    我设置了一个小测试,所以你可以尝试看看我的意思:http://tweetplenty.com/test/test2.php ...使用FF和firebug,如果你可以使用console.log()...这里是操作的顺序:

    1. “普通”链接将向http://tweetplenty.com/test/test.php发出请求而不修改if-modified-since ...后续请求使用“普通”链接应返回304(每次返回200 OK) <秒>)

    2. “if-modified-since”链接将向http://tweetplenty.com/test/test.php请求修改if-modified-since标头,浏览器将返回新内容。

    3. 此时再次单击“正常”会返回先前缓存的数据,我认为在点击“if-modified-since”链接后应该刷新数据。

    4. 如果您想在此处查看测试脚本,请转到:http://tweetplenty.com/test/test.zip

3 个答案:

答案 0 :(得分:1)

我想你想修改所有请求的标题。查看this page上的示例#2。

答案 1 :(得分:0)

听起来像jquery脚本和PHP脚本之间的某种程度的缓存。我怀疑是浏览器级别的缓存。 (虽然理论上它可能是proxy caching,但我猜)

您是否尝试过使用curl或网络浏览器手动尝试AJAX请求?

答案 2 :(得分:0)

当通过XmlHttpRequest发出请求以从服务器脚本获取任何已修改的内容时,您应该附加一些在查询字符串末尾发生变化的变量。

例如,如果您的脚本是

mydomain.com/myscript.php 

然后通过让我们说Jquery Ajax在

发出请求来调用它
mydomain.com/myscript.php?t=[some_value].

通常[t]可以是以毫秒为单位的当前时间或其他数字。

换句话说,每次通过XMLHttpRequest对象发送请求时,请尝试创建唯一的URL。

对于Cache-Control标头,您应该查看更多选项。

此致