6

假设我有一个网络应用程序。我向它添加了一些功能,这些功能需要添加到我的 Web 服务器上的一些现有 CSS 文件中。我将我的新功能和 CSS 添加部署到我的服务器上,它们运行良好。不过,访问该站点的用户可能会在他们的浏览器中缓存 CSS,这意味着在他们手动刷新页面或缓存过期之前,新功能看起来会损坏/奇怪。如果我的服务器和用户之间有缓存服务器,问题可能会更糟,在这种情况下,即使手动刷新也无济于事(我不认为)。

有没有一种常见的方法来避免这种情况?

编辑:我在 ASP.NET 4.0 上运行。

4

4 回答 4

7

您可以将任意名称值对添加到您的 css 请求的末尾,它的行为就好像它没有被缓存一样。例如:

<link media="all" href="myhomepage.css?sid=1" type="text/css" rel="stylesheet">

当您进行更改时,请更改 sid 值。

于 2012-06-29T19:05:46.843 回答
2

我在 Apache 中将以下内容与 PHP 一起使用:

function cssInclude($file) {
    $fileMTime = filemtime($_SERVER['DOCUMENT_ROOT']."/media/css/".$file.".css");
    return "<link rel=\"stylesheet\" href=\"/media/css/{$file}.{$fileMTime}.css\"
}

然后在我的<head>

<?= cssInclude("style"); ?>

然后在我的 .htaccess 中:

RewriteEngine on
RewriteRule ^media/(js|css|img|font)/(.+)\.(\d+)\.(js|css|png|jpg|gif)$ /media/$1/$2.$4 [L]

本质上,这样做是使链接有时间。最初我在使用 ? 的 CSS 之后执行此操作,如在 中style.css?12313123,但发现一些代理没有缓存它,因为他们认为它是动态的,从而使其速度变慢(例如,我的工作搞砸了)。

通过将其编写为style.123123123.css无论何时修改它都好像是一个新文件,并且缓存工作正常。

您会注意到,在我的 .htaccess 中,我还允许自己为不同的目录和几种不同的文件格式执行此操作——根据需要对其进行自定义。

当然,这意味着您正在从文件系统读取内容,但如果您有一个缓存层,那么每次更新只会执行一次。

于 2012-06-29T19:06:26.603 回答
1

当然我不知道你的设置,因为你没有提到它,但假设你有一个像 Tomcat 这样的 serlet 容器,我建议你看看Jawr。其目的来自网站:“Jawr 是一种用于 Javascript 和 CSS 的可调封装解决方案……”</p>

它可以做的比你要求的要多得多,但它也完全自动地实现了@scrappedcola 的想法。客户端将看到一个包含内容哈希的 URL(类似于scripts_A5F68E2.js),该 URL 的缓存属性设置为永恒。每次内容更改时,名称也会更改,因此客户端将重新加载脚本。

于 2012-06-29T20:15:08.293 回答
1

首先,将版本附加到您加载的资源是一种常见的做法。这可以通过版本参数或使用像 yawr 这样的框架来完成。

如果您更喜欢第一个并使用版本控制,则使用 vcs 修订字符串作为版本可能不是坏主意,或者 - 如果您确实发布周期,则使用可能与您的更改最匹配的版本。

在 PHP 或 Python 中,您可以生成一个包含版本字符串的文件,并在所有需要的文件中引用它。使用 Java 或 .NET,您可能希望有一个已编译的工件。

由于您的设置丢失,我不会粘贴示例代码。

于 2012-06-29T20:31:01.360 回答