具有多个浏览器选项卡/会话的Http Cache-Control冲突

时间:2018-03-15 12:21:37

标签: node.js angular http hapijs http-caching

我正在使用Angular 5,带有Hapi NodeJs后端。当我在http响应中发送“cache-control:private,max-age = 3600”标头时,响应被正确缓存。问题是,当我在不同的选项卡中创建完全相同的请求并且连接到不同的数据库时,浏览器选项卡1中缓存的数据在发出相同请求时与浏览器选项卡2共享。有没有办法只使用缓存控制头为每个应用程序实例使用缓存?

  • 浏览器选项卡中的相同Webapp 1.相同的域。
    • 数据库1
  • 浏览器选项卡中的相同Webapp 2.相同的域。
    • 数据库2

1 个答案:

答案 0 :(得分:0)

用户代理需要以某种方式区分这些缓存条目。可能您最好的选择是调整缓存条目密钥(将标识数据库的子域,路径或查询参数添加到URI)。

您还可以使用自定义HTTP标头(例如X-Database)与Vary HTTP标头配对,但在这种情况下,用户代理一次只能存储一个响应,因为它仍然使用URI仅作为缓存密钥和Vary HTTP标头,仅用于响应验证。 Mark Nottingham的The State of Browser Caching, Revisited文章的相关摘录:

  

我看到的一个打嗝是所有经过测试的浏览器缓存一次只能存储一个变体; 即,如果您的回复包含Vary: Foo并且您收到两个请求,则第一个Foo: 1和第二个响应Foo: 2,第二个响应将从缓存中逐出第一个。

     

这是否是一个问题取决于你如何使用Vary;如果要重用具有旧值的缓存响应,可能会降低效率。但是,这似乎不是一个常见的用例;

有关详细信息,请查看Andrew Betts撰写的RFC 7234 Hypertext Transfer Protocol (HTTP/1.1): CachingUnderstanding The Vary Header文章