【问题标题】:Preventing iframe caching in Chrome防止在 Chrome 中缓存 iframe
【发布时间】:2014-09-08 20:19:24
【问题描述】:

我有一个模拟器,用于测试智能电视网络应用程序。模拟器本身是一个网络应用程序,具有显示电视和遥控器的简单界面,并在 iframe 中加载正在测试的网络应用程序。用户从命令行启动模拟器,这会启动两个简单的 HTTP 服务器(一个用于模拟器,一个用于正在测试的 Web 应用程序),然后使用 --app 命令行开关将其指向我的模拟器来启动 chrome。

问题是每次 Chrome 启动时,它都会加载网络应用程序的缓存版本。如果您在上次启动后对 Web 应用进行了更改,则在您硬刷新页面之前不会显示这些更改。

为了解决这个问题,我尝试了以下方法:

  • 通过添加 --disable-cache 开关启动 Chrome
  • 将随机查询参数附加到传递给 chrome 的启动 URL(例如:--app=http://localhost:6001/?random={some_hash}
  • 将随机查询参数附加到 iframe 中指定的网络应用 URL

然而,这些似乎都不起作用。模拟器代码似乎没有被缓存,因为 iframe 中的 src URL 确实每次都附加一个新的随机值。但是,在 iframe 中加载的页面是旧的,并且在首次启动后总是需要刷新。

还有什么我可以尝试但上面没有提到的事情吗?

问题的更多示例:

  • 用户首次为 网络应用 1 启动模拟器
    • Web 应用 1 显示在模拟器中
  • 用户关闭模拟器
  • 用户启动 网络应用 2 的模拟器
    • Web 应用 1 显示在模拟器中

在这种情况下,模拟器将启动并仍然显示 web 应用程序 1。它会通过刷新继续显示 web 应用程序 1,直到用户执行硬刷新 (cmd+shift+r),此时 web 应用程序 2 最终显示.

【问题讨论】:

  • 由于您控制了服务器,您是否尝试过在响应标头中包含所有可能的禁用缓存指令?
  • 好点。虽然我不确定我会怎么做。模拟器被打包为一个 ruby​​ gem,我使用 webrick 作为 http 服务器。我想我有一些谷歌搜索要做。
  • 所以只是为了更新,我修改了服务器的响应标头以包含所有可能的禁用缓存指令(ETag、Last-Modified、Cache-Control、Expires、Pragma),但它没有成功. Chrome 处理 iframe 的错误?
  • 这能回答你的问题吗? Refresh iFrame (Cache Issue)

标签: html google-chrome caching browser-cache google-chrome-app


【解决方案1】:

听起来这可能与这里的错误有关: https://code.google.com/p/chromium/issues/detail?id=324102

作为一种解决方法,我发现从 javascript 设置 iframe src 以及将随机查询参数附加到 URL 似乎可以解决问题。简单地做一个或另一个是行不通的。

例子:

// still loads stale page
document.getElementById('tv-screen').src = 'http://localhost:6001/'; 

// will load fresh page
document.getElementById('tv-screen').src = 'http://localhost:6001/?rand=' + Math.round(Math.random() * 10000000);

【讨论】:

  • Math.round(Math.random() * 10000000) = 太棒了!
  • 或者你可以简单地使用时间戳:'http://localhost:6001/?rand='+ (+ new Date())
  • 你可以去 ?rand=' + new Date()/1
猜你喜欢
  • 2017-05-23
  • 1970-01-01
  • 2011-02-08
  • 2020-11-18
  • 2014-07-16
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
相关资源
最近更新 更多