Contributed by
Jaroslav Kuba
in #22932.

传统 HTTP Cache 架构中的某些部分是基于“浏览器发送 HTTP 请求来询问是否有特定资源在第一次取得之后发生了改变”。若资源(resources)未变,服务器返回一个空的 HTTP response 并带有 304 status (Not Modified/未修改),然后浏览器可以复用之。

可是,现代 web 程序中令资源永不改变是很常见的。例如,当 使用 Webpack Encore 来管理 web assets,你可以开启 versioning 来为每一个资源的 URL 附带上一个“只要资源的内容发生了改变”就会跟着改变的 hash。换言之,它可永久地安全储存那个资源,并始终可以复用而毋须请示服务器。

此技巧已经被很多大牌服务诸如 Facebook 所用,并帮助它们 减少了 60% 的向服务器请求静态资源的时间 并且极大改善了页面加载时间。在 2017年9月,得益于 RFC 8246 协议,IETF 将此一技巧官方化,而 Symfony 3.4 也包括了对它的支持。

实践中,immutable HTTP responses,通过 Cache-Control: immutable header 可以创建,这个头可以结合其他缓存选项来使用 (如,发起一个一年的 immutable 响应: Cache-Control: max-age=31536000, immutable)。在 Symfony 3.4 中,这项设定由 Response 类中全新的 setImmutable(boolean $isImmutable)isImmutable() 方法来控制。 当设置了多个缓存选项时,配合 setCache() 方法来使用 immutable 选项。