【问题标题】:can we forcibly clear browser cache through some code我们可以通过一些代码强制清除浏览器缓存吗
【发布时间】:2023-03-23 19:22:02
【问题描述】:

我们有一个包含大量静态资源的项目,以使页面加载更快,我们经常使用浏览器缓存。现在我们面临的问题是每次更新静态内容的 css 或 js。用户抱怨一些问题。我知道用户可以手动清除缓存并获得正确的东西。但是当更新文件出现时,这不可能。它会加载一个新版本的自身,我们正在使用带有 wamp 的 php。

【问题讨论】:

  • 更改名称的替代方法(通过附加随机字符串)是告诉服务器发送与缓存相关的 HTTP 标头并像这样控制缓存。但真正最好的方法就是不更改文件,即使文件更稳定..
  • 嘿戳我相信我正在寻找您指向的解决方案。你能给我一些指导吗?我怎样才能让我的浏览器发送与缓存相关的标头,以便它加载文件的更新版本。
  • 请参阅下面 Gary Green 的回答,这几乎为您提供了基础知识。然后,您可以通过.htaccess 设置标头,甚至可以通过将文件包装在 php 文件中并在之前使用header( ... ) 发送缓存标头。 php 手册中header entry 上的 cmets 也很好地概述了您如何设置与缓存相关的标头。

标签: php performance caching


【解决方案1】:

首先,这取决于您将expires 标头发送了多长时间- 一天?星期?月份?

无论您何时设置 expires 标头,您都必须等到该时间结束后,浏览器才开始联系服务器以获取新版本。因此,正如其他人指出的那样,您将不得不更改网址

不过,还有另一个不错的选择适合您,未来...

如果您设置'cache-control: "no-cache, must-revalidate"' 和较短的Expires 时间,则浏览器将在每次想要重新显示缓存对象时与服务器进行检查,使用"If-Modified-Since" 请求标头在其“Last-Modified”响应标头中发送您的服务器最初与该缓存对象一起发送的最后一个时间戳。如果自客户端发送的时间戳以来对象已更新,则服务器将发送新对象和新的Last-Modified时间戳标头。如果不是,它将仅以“304-Not Modified”响应标头进行响应。

因此,重新验证的优点是您仍然可以节省一些带宽,而客户端显示“陈旧”对象的风险很小,但缺点是客户端必须等待服务器检查客户端的 If-Modified-Since 标头文件的“Last-Modified”时间戳,当然,服务器必须实际检查文件系统以获得“Last-Modified”时间。所以节省的只是实际的内容传输带宽和传输时间。


不错的阅读资源

【讨论】:

    【解决方案2】:

    强制用户重新加载静态资源的最快和最简单的方法是向其附加查询字符串参数,例如如果你的脚本是

    <script type="text/javascript" src="myscript.js"></script>
    

    需要用户重新加载吗?追加?v=2

    <script type="text/javascript" src="myscript.js?v=2"></script>
    

    又更新了?

    <script type="text/javascript" src="myscript.js?v=3"></script>
    

    等等

    【讨论】:

    • 其实 Stack Overflow 就是这么干的:http://sstatic.net/stackoverflow/all.css?v=82a4a8691f11
    • @chriso : 谢谢它真的很有帮助... :)
    【解决方案3】:

    您可以通过重命名来强制用户重新下载静态文件,或者很多人所做的就是在请求中添加一个带有最后更新时间的时间戳,例如:

    &lt;img src="logo.png?212312313"/&gt;

    每次更改时,用户都会重新下载新文件。这可以通过检查文件修改时间或手动添加随机字符串(可能是版本号?)来自动化服务器端。

    【讨论】:

      【解决方案4】:

      您可以使用一个技巧来强制浏览器加载较新版本的 css/js 文件。

      假设您的文件名为“layout.css”(或“common.js”),则包含该文件的语法为

      <link rel="stylesheet" href="/layout.css">
      

      聪明的部分是在文件名的末尾添加一个查询字符串,例如

      <link rel="stylesheet" href="/layout.css?version=1">
      

      因此,每次更改 js / css 文件时 - 添加与以前不同的查询字符串(我认为最好的方法是每次更改时增加版本号)。

      【讨论】:

        猜你喜欢
        • 2015-07-12
        • 2016-02-18
        • 2016-10-01
        • 2012-02-01
        • 2015-10-29
        相关资源
        最近更新 更多