强制刷新缓存的CSS数据。

12 浏览
0 Comments

强制刷新缓存的CSS数据。

是否有可能强制浏览器刷新缓存的CSS?

这不像每次请求那样简单。我们有一个稳定了一段时间的网站。

现在我们需要对CSS进行一些重大更新;但是,已经缓存了CSS的浏览器将在几天内无法接收到新的CSS,从而引起渲染问题。

有没有一种方法来强制刷新CSS,或者我们最好选择版本特定的CSS URL?

admin 更改状态以发布 2023年5月23日
0
0 Comments

我认为重命名CSS文件是个更好的点子。它可能并不适用于所有应用程序,但它将确保用户只需加载一次CSS文件。在结尾添加随机字符串将确保他们每次都要下载。

对于上面的javascript方法和apache方法也是一样。

有时候,简单的答案可能是最有效的。

另一种解决方案是:


    Header set Cache-Control "max-age=86400, public"

这将限制最大缓存时间为1天或86400秒。

0
0 Comments

简述

  • 更改文件名或查询字符串
  • 使用每次发布仅发生一次的更改
  • 文件重命名优于查询字符串更改
  • 始终设置HTTP头以最大化缓存的好处

有几件事情需要考虑,有多种方法可以解决这个问题。首先,规范

我们想要达成什么目标?

理想情况下,修改后的资源将在第一次请求时被无条件地获取,然后从本地缓存中检索,直到到期,而不需要任何后续的服务器交互。

缓存行为观察

跟踪不同的排列方式可能会有点混淆,因此我创建了以下表格。这些观察结果是通过使用Chrome对IIS进行请求并观察开发人员控制台中的响应/行为生成的。

在所有情况下,新的URL都将导致HTTP 200。重要的是随后的请求发生了什么。

+---------------------+--------------------+-------------------------+
|        Type         |   Cache Headers    |     Observed Result     |
+---------------------+--------------------+-------------------------+
| Static filename     | Expiration +1 Year | Taken from cache        |
| Static filename     | Expire immediately | Never caches            |
| Static filename     | None               | HTTP 304 (not modified) |
|                     |                    |                         |
| Static query string | Expiration +1 Year | HTTP 304 (not modified) |
| Static query string | Expire immediately | HTTP 304 (not modified) |
| Static query string | None               | HTTP 304 (not modified) |
|                     |                    |                         |
| Random query string | Expiration +1 Year | Never caches            |
| Random query string | Expire immediately | Never caches            |
| Random query string | None               | Never caches            |
+---------------------+--------------------+-------------------------+

然而,记住浏览器和Web服务器并不总是按照我们的预期行为。一个著名的例子:在2012年,移动Safari开始缓存POST请求。开发人员并不满意。

查询字符串

ASP.Net MVC Razor语法的例子,但几乎适用于任何服务器处理语言。

由于一些应用程序传统上使用带有查询URL的GET和HEAD来执行具有重大副作用的操作,即在rel_path部分包含“?”的操作,
除非服务器提供明确的过期时间,否则缓存不得将此类URI的响应视为新鲜。这特别意味着来自HTTP/1.0服务器的此类URIs的响应
不应从缓存中取出。

在您的HTML中包含的CSS URL末尾添加一个随机参数将强制进行新请求,服务器应该用HTTP 200响应(即使没有修改,也不应该是304)。


当然,如果我们随每个请求随机化查询字符串,这将完全破坏缓存。对于生产应用程序,这很少/从不是可取的。

如果您只维护一些URL,则可以手动修改它们以包含版本号或日期:

@{
    var assembly = Assembly.GetEntryAssembly();
    var name = assembly.GetName();
    var version = name.Version;
}

这将导致用户代理第一次遇到URL时进行新请求,但随后的请求将大多返回304。这仍然会导致发出请求,但至少不是整个文件被返回。

路径修改

更好的解决方案是创建一个新的路径。通过一些努力,这个过程可以自动化,以使用版本号(或其他一些一致的标识符)重新编写路径。

这个答案 显示了一些非Microsoft平台的简单而优雅的选项。

Microsoft的开发人员可以利用HTTP模块来拦截对特定文件类型的所有请求,或者可能利用一个MVC路由/控制器组合来提供正确的文件(我没有看到过这样的做法,但我相信这是可行的)。

当然,最简单的(不一定是最快或最佳的)方法就是在每次发布时重命名相关文件,并在link标签中引用更新的路径。

0