在 HTTP 请求中缓存:ETag 与 max-age
Caching in HTTP requests: ETag vs max-age
我有一个 SPA,它使用来自后端服务器的一些静态资产。由于某些原因,我选择 ETag
验证作为缓存机制。简而言之,我希望浏览器将资产永远保存在其缓存中,只要相关的 ETag
保持不变即可。
要向浏览器发出有关缓存的信号,header Cache-Control
必须出现在响应中。对我来说这完全可以理解,但让我感到困惑的是我还必须在 header 中提供 max-age
。换句话说 Cache-Control=public
不起作用,而 Cache-Control=public, max-age=100
是正确的 header.
对我来说这听起来很矛盾。浏览器使用 If-Not-Match={ETag}
随时 查询服务器以查看资产是否已更改。那么max-age
在这里的作用是什么?
缓存在浏览器中的带ETag的resource/file无论如何每次都会被请求。如果这是在服务器上更改的 *.js
文件,则服务器将发送带有新 ETag 的新版本,浏览器将刷新其缓存版本。
但无论如何执行请求和响应的完整网络往返,这是非常昂贵的。
如果您确实希望某些文件真的可以随时更改,那么您必须使用 ETag。
Cache-Control
是对浏览器的指令,在 max-age
指定的一段时间内甚至不尝试检索更新版本。这是更高效的。
这对于可能不会更改的静态资产很有用,例如jquery-3.1.js
文件将始终相同。
或者即使资源被改变也没什么大不了的,例如style.css
.
在开发过程中,当资产经常更改时,Cache-Control
通常被禁用。
但请注意 public
修饰符:这意味着资源可能会缓存在代理服务器(如 CloudFlare)上并在不同用户之间共享。如果资源有私人信息,例如消息,然后用户可以看到彼此的数据。
我有一个 SPA,它使用来自后端服务器的一些静态资产。由于某些原因,我选择 ETag
验证作为缓存机制。简而言之,我希望浏览器将资产永远保存在其缓存中,只要相关的 ETag
保持不变即可。
要向浏览器发出有关缓存的信号,header Cache-Control
必须出现在响应中。对我来说这完全可以理解,但让我感到困惑的是我还必须在 header 中提供 max-age
。换句话说 Cache-Control=public
不起作用,而 Cache-Control=public, max-age=100
是正确的 header.
对我来说这听起来很矛盾。浏览器使用 If-Not-Match={ETag}
随时 查询服务器以查看资产是否已更改。那么max-age
在这里的作用是什么?
缓存在浏览器中的带ETag的resource/file无论如何每次都会被请求。如果这是在服务器上更改的 *.js
文件,则服务器将发送带有新 ETag 的新版本,浏览器将刷新其缓存版本。
但无论如何执行请求和响应的完整网络往返,这是非常昂贵的。
如果您确实希望某些文件真的可以随时更改,那么您必须使用 ETag。
Cache-Control
是对浏览器的指令,在 max-age
指定的一段时间内甚至不尝试检索更新版本。这是更高效的。
这对于可能不会更改的静态资产很有用,例如jquery-3.1.js
文件将始终相同。
或者即使资源被改变也没什么大不了的,例如style.css
.
在开发过程中,当资产经常更改时,Cache-Control
通常被禁用。
但请注意 public
修饰符:这意味着资源可能会缓存在代理服务器(如 CloudFlare)上并在不同用户之间共享。如果资源有私人信息,例如消息,然后用户可以看到彼此的数据。