1

这是一种核心的 Web 开发主题,而且很难搜索。

我正在运行一个中型网站,每天约 2500 个用户。我们每个月都在大力开发新功能。我们有一个带有 master、dev/master 和一些其他开发分支的 GIT 设置。我们有一个登台服务器和一个开发服务器,而且我们都在本地工作,直到我们推送到开发。

但是,当我将更改推送到 dev 甚至 live 时,通常情况下用户必须刷新缓存,否则他们会看到错误。

我们确实使用 HTML5 应用程序缓存,当我们更改清单时,它会让所有文件重置。但是我们并没有为整个应用程序使用 App Cache,只是一些使应用程序更快的资源。

撇开应用缓存不谈,这在我们的旧网站中仍然是个问题,即使没有应用缓存。我知道你可以在 JS 和 CSS 文件之后做 ?timestamp 。但我希望用户缓存这些。它加快了他们的体验。

那么,如何让用户缓存内容以提高速度,但在我推送更新时获得最新内容?大佬们是怎么处理的呢?

谢谢!

4

3 回答 3

2

我想在这里给出一个明确的答案,因为这个问题的解决方案太棒了。这基本上就是凯所说的。

在 PHP 中,我们这样做define("GIT_HASH",exec(GIT." rev-parse --short HEAD 2>&1")); ,其中 GIT 是您的 git bin 的路径。在 linux 上它只是 git,在 mac 上它就像 /usr/local/bin/git

然后我们将我们的 GIT 哈希放入 JS 中以与 require.js 一起使用

<script>
    window.app_hash = '<?=GIT_HASH;?>' || '';
</script>

现在我们有了哈希值,所以我们只是更改了 require.js 的配置

require.config({
baseUrl: '__' + app_hash,

我们也有这个用于硬编码的 PHP url /css/main.css">

最后我们使用了 NGINX 重写规则来允许这个

rewrite ^/__[^/]*/(.+) /$1 last;

对于 htaccess 中的 apache

RewriteRule ^__[^/]*/(.+) /$1

__ 是我们用于哈希的前缀,只是为了清楚起见。NGINX 中的最后一个是我们的其余规则会受到影响,而对于 htaccess,您不需要它。

我们没有使用像 ?whatever 这样的查询字符串的原因是因为某些浏览器永远不会缓存带有这样的查询字符串的 URL。我们不想要这样,我们想要缓存,而不是在部署时。

如果您不使用 require.js - 您必须将所有 URL 更改为语法,但它值得。

如果您使用 html5 应用程序缓存,请务必取出其中的所有 css 和 js。

谢谢凯!

于 2013-04-08T06:27:33.720 回答
1

从我读过的内容来看,当您添加查询字符串时,浏览器缓存文件的方式有所不同。所以我使用的解决方案是让 URL 看起来像这样:

<script type="text/javascript" src="/resources/cacheholder1/js/site.js" />

每次我构建我的项目并准备部署新版本时,我都会增加这个数字。当然,当你有几十/几百行这样的行时,这很烦人。因此,我编写了一个 bash 脚本来检查我的项目并查找与以下模式匹配的任何内容:

/resources/cacheholder(#)/

然后取匹配的数字,增加它,然后更新/保存文件。

当然,使用项目编号而不是任意数字可能更明智,只要您实际跟踪项目编号并且它会自动更改。这对我们现在有效,所以我坚持使用它,但一直计划使用项目编号。

这应该可以正确缓存文件,因为它是一个“新” URL,而不仅仅是查询字符串的更改。同时,我花了一些额外的配置来允许这个 URL 方案,因为“缓存持有者”部分发生了变化(数字),所以你不能在你的项目中硬编码 URL 映射。

查询字符串的问题是浏览器不应该缓存带有查询字符串的请求,所以在做和不做之间有一个混合。而且我敢打赌(因为我记得它发生过)唯一的就是IE。其他浏览器似乎遵循规范不缓存带有查询字符串的请求。

于 2013-03-28T14:07:30.970 回答
0

中的查询字符串asset?timestamp使 Firefox 向服务器询问每个请求。即使您可以使用 304 响应,这也是资源和用户时间的浪费。

www.example.com/assets/<git hash>/name.js在我的项目中使用它,它工作正常。仅当内容被编辑时,修订才会更改,因此不会有不必要的查询。

静态内容设置为 1 个月后过期:

最后修改时间:2013 年 3 月 28 日星期四 12:16:21 GMT
缓存控制:公共,最大年龄=2678400
过期:2013 年 4 月 28 日星期日 14:00:58 GMT
ETag:“flask-1364472981.38-9149-1640239173”

在您的部署过程中,您必须替换<git hash>布局文件中的 。

您会在上次修改资产时获得修订:

git log --format=%h -1 -- path/to/asset.js
于 2013-03-28T14:06:13.627 回答