为什么Symfony2 AppCache在响应为私有时不允许Etag缓存?

时间:2014-03-01 12:26:44

标签: php symfony http-headers cache-control

我在复杂的Web应用程序中使用Symfony2并使用HTTP缓存来加速应用程序。

在存在内容页面(在私有登录区域内)的情况下,生成成本很高并且只需要在底层实体更改时刷新,我想使用ETag标头来管理缓存Symfony2食谱中描述的方式:

http://symfony.com/doc/current/book/http_cache.html#optimizing-your-code-with-validation

当响应设置为“公共”和公共页面时,此方法可以正常工作。这是因为它使用Symfony反向代理(AppCache)来管理缓存。

但是我不希望响应是公开的(或由反向代理缓存)。

据我了解HTTP缓存,浏览器完全可以私下缓存页面并使用ETag与我的控制器进行通信,以确定何时需要刷新内容。如果浏览器从我的应用程序收到304,如果“If-None-Match”请求标头与响应中的ETag匹配,我希望如此。

但是,当AppCache on(生产中)时,响应被标记为Private(或者如果它在默认情况下是私有的,因为请求头中有cookie),HttpCache(Symfony 2.3)中的fetch方法会这样:

// avoid that the backend sends no content
...
$subRequest->headers->remove('if_none_match');

这基本上意味着当响应中的isNotModified()方法在我的控制器中运行时,即使请求中存在request->getEtags()标头,If-None-Match也会返回一个空数组。因此,isNotModified()始终为false,我的应用程序每次都会重新生成内容。

我的问题是:为什么Symfony的AppCache通过清除if-none-match标头来阻止这种形式的私有缓存验证?它有充分的理由吗?使用私有响应的ETag标头不是一件明智的事情吗?

有没有办法禁用AppCache的这种行为?

0 个答案:

没有答案