我在复杂的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的这种行为?