如何停止Opera缓存页面?

我试图让Opera每次重新请求一个页面,而不是从缓存中提供它。 我发送'Cache-control:no-cache'和'Pragma:no-cache'响应头文件,但似乎Opera只是忽略了这些头文件。 它可以在其他浏览器中正常运行 - Chrome,IE,Firefox。

如何停止Opera缓存页面? 我希望能够做的是当用户点击浏览器上的返回按钮时,Opera重新请求一个页面。


作为一名用户,当我使用后退按钮时,我绝对厌恶通过强制重新加载而拖慢我的历史导航的页面。 (如果您每天使用的浏览器注意到各种缓存指令,并让它们以您希望作为开发者的方式影响历史导航,您可能会注意到一些网站会让您的速度变慢......)

如果你有这样一个非常强大的用例,我会说你的架构在某种意义上可能是“错误的”,例如,如果你在不断更新数据的不同“视图”之间切换,当用户返回时使用Ajaxy技术将不断变化的数据加载到当前页面会更好?

Opera的实现是有目的的 - “缓存”在概念上与“历史导航”有所不同,前者更多的是将内容存储在磁盘和会话之间,后者将切换回刚刚访问的临时隐藏页面,处于状态你离开了它。

但是,如果你确实需要这个策略,那么这个策略就会存在一个漏洞,使得你想要的行为成为可能。 发送“ 缓存控制:必须重新验证 ”将强制Opera重新加载导航上的每个页面,但前提是您要通过https发送页面。 (这是偏执银行所要求的功能,如果应用于http,它会减慢太多正常站点的速度)。


这听起来像你的问题与这个答案有关。 在测试您的头文件和建议的头文件后,我只能在Internet Explorer中重现您的预期行为。


简单的服务器缓存控制,无需标题或前端脚本

零依赖,通用语言版


您可以通过将md5或sha1校验和附加到文件名中来强制全局重新缓存而不使用头。

这样它会缓存,如果它是一个完全匹配,否则对待它像一个新的资源。

  • 适用于所有浏览器
  • 验证为严格的HTML5(原本没有,但已更新,未经XHTML测试,但可能无效)
  • 不需要额外的标题
  • 保持前端问题和后端问题很好地解耦。
  • 不需要客户端的完整性检查或源验证。
  • 任何可以打印html的东西都可以做到这一点,包括静态内容
  • 如果不是静态的,则可以轻松地将运行时控制扩展到最终用户(如果需要,可以使用身份验证),从而允许简单的页面标志确定返回的缩小,优化或调试源。
  • 将内容服务机制中的客户端缓存控制完全封装起来,这使得维护起来非常简单。
  • 作为一种侧重点,通过推迟浏览器缓存的校验和来自动引入版本化的客户端缓存,如果您有替代版本并需要对发布包进行单元测试以确定它是最小的稳定依赖版本或什么的,那么这会很有用。

  • 永远不要与您的浏览器以获得高速缓存未与您的开发过程中干扰再次拨弄。

  • 这种方法也可用于版本化的图像,视频,音频,pdf等。几乎任何作为静态数据提供服务的资源都将以类似的方式运行,缓存内容的第一个请求,并自动保留,无需进一步考虑文件不会改变。


  • 这是RFC有效标记。 注意脚本和链接标签有一个get字符串:

    ?checksum=ba411cafee2f0f702572369da0b765e2

    <!doctype html>
    
    <html lang="en">
    <head>
      <meta charset="utf-8">
    
      <title>Client Cache Control Example</title>
      <meta name="description" content="You're only going to cache this when the content changes, and always when the content changes.">
      <meta name="author" content="https://stackoverflow.com/users/1288121/mopsyd">
    
      <!-- Example Stylesheet -->
      <link rel="stylesheet" href="css/styles.css?checksum=ba411cafee2f0f702572369da0b765e2">
    
      <!-- Example Script -->
      <script src="js/scripts.js?checksum=ba411cafee2f0f702572369da0b765e2"></script>
    </head>
    <body>
    </body>
    </html>
    

    GET字符串?checksum=ba411cafee2f0f702572369da0b765e2引用资源的文件大小的MD5或SHA1散列。 它可以通过命令行,语言结构或通过从Content-Length:头的值中散列它来获得。 然后通过将它作为GET字符串附加到文件名来构造您的hrefsrc属性。

    这个浏览器将把它们解释为独立的,并分开缓存。

    如果服务器是静态资源,服务器将忽略GET参数,但如果它是动态服务的,则GET参数将可用于解释语言。

    这意味着只要链接中的哈希值发生变化,浏览器就会一次性独立缓存该特定版本,然后将其保留至永久,或者Expires:随时更新,无论哪个更早。

    由于校验和是文件大小的直接反映,因此您可以将“ Expires:设置为永久,并且没有太大区别。 只要该文件更改了一个字节,您仍然会立即看到您的更改。

  • 用你平时做的任何工具生成你的css或js源代码。

  • 如果您正在动态提供服务,则在运行时在文件大小上运行 md5或sha1校验和;如果您正在生成静态内容(例如ApiGen文档),则在编译 时运行

  • 使用散列作为附加到文件名的GET字符串服务正常文件(例如: styles.css变为styles.css?checksum=ba411cafee2f0f702572369da0b765e2

  • 文件中的任何更改都会强制执行重新缓存,这意味着您会立即看到实际值。

  • 可选,但rad:这种方法的另一个好处是,您可以轻松设置一个开发GET标志,这将使所有前端源代码解析以启用您自己的任何自定义调试功能来优化开发源代码,或者使用它来解释版本控制标志。 您可以执行冗余检查以确保该标志只从服务器的已知开发IP地址,代理身份验证等传递,否则,如果您需要安全标志,则不会执行该标志。 我通常会尽可能将我的前端源码分成类似于以下内容的内容:

  • 这就是它现在正在做的事情(缩小制作,缓存,默认, ?checksum=ba411cafee2f0f702572369da0b765e2 )。
  • 这就是它现在应该做的事情,对我来说已经足够?debug_pretty_source=true生产,从不缓存, ?debug_pretty_source=true )。
  • 这是我用来弄清楚什么是不应该做什么,如果它存在于以前(启用调试,未缓存,授权ACL /白名单, ?debug_dev_enable=true或类似)中都存在的应该存在的?debug_dev_enable=true
  • 如果您的版本不更改,则可以通过使用版本号而不是校验和来应用相同的原则。 校验和的可读性较差,但易于自动化并与确切的更改保持同步,但版本后缀对测试程序包稳定性也很有用,前提是版本号反映了不可变的资源。

    链接地址: http://www.djcxy.com/p/55737.html

    上一篇: How do I stop Opera from caching a page?

    下一篇: How to force a web browser NOT to cache images