使用NGINX + Express进行URL指纹识别/攻击性缓存

Pal*_*gie 13 caching nginx node.js express

在NGINX(代理)和Node/Express堆栈中处理积极缓存和URL指纹识别的推荐技术是什么?

Google建议"使用指纹识别来动态启用缓存".在他们的最佳实践指南中,这正是我想要实现的目标.

我已经研究了很多不同的指纹识别方法,但是我很难理解在什么情况下这些方法实际上会产生新的指纹以及最适合的开发流程的哪个部分.我之前曾假设,如果文件中的"Last-Modified"发生了变化,那么服务器将生成另一个指纹,但现在似乎并非如此.(除非我配置错误)

以下是一些不同的方法:

运行时指纹识别

构建指纹识别

CI指纹识别

所以我希望有人可以回答几个问题:

  1. 指纹识别甚至是ETag的要求还是在跨浏览器支持中有太多漏洞?

  2. 资产应该可以说是CDN,所以这个问题很大程度上推迟到CDN提供商(如果是这样,你如何在没有人工参与的情况下更新参考资料)?

  3. 如何在没有手动缓存清除的情况下生成新指纹?

  4. 关于指纹识别将位于开发人员管道中的建议是什么?我想避免依赖Grunt.js之类的东西

我觉得我错过了一些令人眼花缭乱的明显事物,所以如果你能回答其中一个问题,我会非常感激.

Dan*_*ohn 12

指纹识别和Etags是减少加载时间的独立功能.

如果浏览器已缓存资产且资产未更改,则Etags可避免重新发送资产.但是,浏览器仍然需要单独的HTTP往返来发送If-None-Match并返回304 Not Modified.

加快HTTP往返速度的最佳方法是避免制作一个.当网站的第二页使用与第一页相同的资产,并且这些资产具有远期未来的缓存过期标题时,在第一次请求后,甚至不需要为这些资产进行单次往返.

指纹识别是一种为每个资产提供从其内容派生的唯一名称的技术.然后,即使资产(例如CSS包)中的一位发生更改,其名称也会更改,因此浏览器将获取更新的资产.并且,由于指纹识别使用内容的加密哈希,因此只要资产相同,就可以在多个服务器上计算相同的唯一名称.各地的缓存(CDN,ISP,网络设备或Web浏览器)都能够保留每个资产的副本,但由于HTML引用了每个资产的唯一名称,因此只会提供该资产的正确版本从缓存.

每个浏览器都支持Etags和指纹识别.

  1. 指纹识别不是必需的,它是一种优化.如果您使用的是已经需要构建步骤的Stylus,Browserify和AngularTemplateCaches等技术,那么添加指纹是免费的.

  2. 您的HTML页面将具有相似的名称,/aboutus而不是/aboutus-sfghjs3646dhs73shwsbby3指纹识别.您链接的所有解决方案都支持Javascript,CSS和图像的指纹识别,以及在指纹名称中动态替换HTML的方法.因此,HTML将引用,/css-hs6hd73ydhs7d7shsh7w直到您更改CSS中的字节,然后它们将引用/css-37r7dhsh373hd73(不同的文件).

  3. 修改文件时只需要生成指纹,通常应该在服务器重启或构建时生成指纹.

  4. 我推荐Asset Rack,它支持许多资产类型,可以从RAM提供指纹资产或将它们推送到CDN.每次Express启动时都会生成所有指纹.