这是一个核心的Web开发主题,也很难搜索。
我正在运营一个中型网站〜每天2500个用户。我们每个月都在大力开发新功能。我们有一个GIT设置,包括master,dev / master和其他一些开发分支。我们有一个临时服务器和一个开发服务器加上我们都在本地工作,直到我们推送到dev。
但是,当我将更改推送到dev或甚至是live时,通常情况是用户必须刷新缓存,否则他们会看到错误。
我们确实使用HTML5应用程序缓存,当我们更改清单时,将重置所有文件。但是我们没有在整个应用程序中使用App Cache,只是一些使应用程序更快的资源。
除了App缓存之外,即使没有应用缓存,这仍然是我们旧网站中的问题。我知道你可以做到?JS和CSS文件之后的时间戳。但我希望用户缓存这些。它加快了他们的体验。
那么,如何让用户缓存内容以提高速度,以及在推送更新时获取最新内容?大男孩怎么处理这个?
谢谢!
答案 0 :(得分: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网址,我们也有此功能 /css/main.css">
最后我们使用了NGINX重写规则来允许这个
rewrite ^/__[^/]*/(.+) /$1 last;
对于htaccess中的apache
RewriteRule ^__[^/]*/(.+) /$1
__是我们用于哈希的前缀,只是为了清楚。 NGINX中的最后一个是我们的其他规则被击中,而对于htaccess,你不需要它。
我们没有使用类似查询字符串的原因是什么?因为某些浏览器永远不会使用类似的查询字符串来缓存URL。我们不希望这样,我们需要缓存,而不是在部署时。
如果您没有使用require.js - 您必须将所有URL更改为语法,但值得信赖。
如果你使用的是html5应用程序缓存,请务必取出你在那里的任何css和js。
谢谢凯!
答案 1 :(得分:1)
从我读过的内容来看,当您添加查询字符串时,浏览器缓存文件会有所不同。所以我使用的解决方案是让URL看起来像这样:
<script type="text/javascript" src="/resources/cacheholder1/js/site.js" />
每次构建项目并即将部署新版本时,我都会增加此数字。当然,当你有几十条/几百条线路时,这非常烦人。所以我编写了一个bash脚本来完成我的项目并查找符合以下模式的任何内容:
/resources/cacheholder(#)/
然后获取匹配的数字,增加它,并更新/保存文件。
当然,使用项目编号而不是任意编号可能更明智,只要您实际跟踪项目编号并自动更改。这对我们来说现在很有用,所以我坚持使用它,但一直计划使用项目编号。
这应该正确缓存文件,因为它是一个“新”URL,而不仅仅是一个查询字符串更改。同时,我需要一些额外的配置才能允许这个URL方案,因为“cacheholder”部分会更改(数字),因此您无法对项目中的URL映射进行硬编码。
查询字符串的问题在于浏览器不应该使用查询字符串来缓存请求,因此在它们之间存在混合。我打赌唯一一个(因为我记得它发生)是IE。其他浏览器似乎遵循规范不使用查询字符串缓存请求。
答案 2 :(得分:0)
asset?timestamp
中的查询字符串会导致Firefox向服务器询问每个请求。这是浪费资源和用户的时间,即使你可以回复304。
我在我的项目中使用www.example.com/assets/<git hash>/name.js
,它运行正常。只有在编辑内容时,修订才会更改,因此不会有不必要的查询。
静态内容设置为在1个月内过期:
Last-Modified: Thu, 28 Mar 2013 12:16:21 GMT Cache-Control: public, max-age=2678400 Expires: Sun, 28 Apr 2013 14:00:58 GMT ETag: "flask-1364472981.38-9149-1640239173"
在部署过程中,您必须替换布局文件中的<git hash>
。
上次修改资产时,您将获得修订:
git log --format=%h -1 -- path/to/asset.js