我正在開發一個symfony2網站,我需要緩存幾個頁面,但有些部分必須保持未緩存(如用戶菜單等)。我已經檢查過這個文檔,而且ESI似乎正是爲此而構建的。Symfony2 ESI緩存+最後修改日期
我開始在我的博客文章頁面的項目中實現緩存。我按照Symfony2文檔中的建議設置了最後修改和Etag的緩存驗證。
我在我的所有頁面的標題中有一個用戶菜單。它使用ESI進行渲染,並確保它不緩存。據我所知,它不工作。每次我的整個博客文章頁面都會與用戶菜單一起被緩存。它被保存到瀏覽器緩存中,並且只在我實際更新博客文章時更新(這是正確的)。
這裏是我的博客文章控制器代碼:
public function showAction($slug)
{
$response = new Response();
$response->setETag(md5($response->getContent()));
$date = $article->getModifiedAt();
$response->setLastModified($date);
$response->setPublic();
$response->headers->addCacheControlDirective('must-revalidate', true);
// Check that the Response is not modified for the given Request
if ($response->isNotModified($this->getRequest())) {
// return the 304 Response immediately
return $response;
} else {
//do stuff
return $this->render('NewsBundle:News:show.html.twig', array(
'article' => $article,
),$response);
}
我的用戶菜單控制:
public function userMenuAction()
{
$response = new Response();
$response->setSharedMaxAge(0);
return $this->render('MainBundle:Views:userMenu.html.twig', array(
'user' => $user,
),$response);
}
MY ESI路由
ESI_userMenu:
pattern: user-menu
defaults: { _locale: en, _controller: MainBundle:Default:userMenu }
ESI渲染:
{% render url('ESI_userMenu') with {}, {'standalone': true} %}
當我加載我的博客文章頁面時,我注意到用戶菜單也被緩存。 我測試了更多,並發現如果我不使用「isNotModified」,但設置了過期壽命時間,ESI確實有效。
有什麼方法可以讓ESI與我用於博客文章的「isNotModified」結構一起工作?
感謝
編輯:
ESI似乎並不與驗證緩存工作...
在這裏看到: With Symfony2 why are ESI tags inside cached responses ignored?