如何在S3 + CloudFront上托pipe的静态网站中禁用Last-Modified和ETag标头?

背景 :对于某些网站资产,要禁用Last-ModifiedETag标头有很好的理由:防止浏览器发送条件请求(分别使用If-Modified-SinceIf-None-Match )。 这很好,因为有条件的请求只是浪费了一个在URL中有版本号或摘要的资产的往返行程,即当你做出了一个承诺,那就是URL总是永远地服务于相同的内容体。 在这种情况下,强制浏览器直接访问本地caching通常会更好。


我的问题是 :我想要使用S3和CloudFront托pipe一个静态网站。 这将是相当低的stream量,我希望它快。 但是没有明显的方法来阻止这些头文件通过客户端 – 您不能在S3上禁用它们,也不能将CloudFrontconfiguration为将其除去。

我考虑的选项:

  • 在S3和CloudFront(例如EC2)之间放置一个代理服务器,只需要剥离这些头文件
    • 对我来说,这违背了静态网站的整个点; 我想尽量减less运动部件
  • 使用不同的CDN,允许您去除标题(例如可以使用Fastly的VCLconfiguration)
    • 我真的很喜欢CloudFront的零最低月度消费,这使得它对于低stream量的网站来说非常便宜。

还有什么我可以尝试?

…当你做出承诺,该URL将永远服务于相同的内容主体。 在这种情况下,强制浏览器直接访问本地caching通常会更好。

浏览器(或其他caching)将不会访问来源,直到它认为内容已过期。 在你的情况下,你会想发送相应的Cache-Control或者Expires指示最长的caching时间。 这是创build有关URL稳定性的唯一方法。 删除ETagLast-Modified将增加发送的数据,而不是减less。 这是因为如果没有这些头文件,浏览器和原点将被迫刷新整个内容,而不是简单地执行一个简单的重新validation

在使用CDN的情况下,您可能正在寻找的是让您覆盖提交给最终用户的Cache-ControlExpires标头,以表明它们应该无限期地caching内容,即使CDN需要重新validation它。 所以,如果CDN能够根据ETagLast-Modified标头重新validation内容,则符合您的兴趣,而不pipe您向最终客户端发布什么内容。