3

我想知道是否存在诸如私有 ESI 片段之类的东西。在我阅读的文档中:

  1. “设置共享的最大年龄 -这也将响应标记为公开
  2. “一旦开始使用 ESI,请记住始终使用 s-maxage指令而不是 max-age。由于浏览器只接收聚合资源,它不知道子组件,因此它将遵守 max-年龄指令并缓存整个页面。而你不希望这样。”

我不完全了解我是否能够按用户缓存页面的某些部分。有人可以解释一下吗?

提前致谢!

4

2 回答 2

5

您可以基于每个用户缓存页面的某些部分。

他们的关键是清漆配置,您将共享的最大年龄设置为您的 ttl 的正常值,然后将为该用户缓存该 esi 请求。

然后看看这个Varnish 食谱缓存为登录用户,关键是你需要一个带有散列用户 ID 的唯一 cookie,并myapp_unique_user_id在示例中用你的 cookie 名称替换。

这是一个示例控制器,其中包含缓存和非缓存操作。

<?php

namespace MyTest\Bundle\HomepageBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;

class TestController extends Controller
{
    /**
     * UnCached html content
     *
     * @Route("/test_cache", name="homepage")
     *
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function homepageAction()
    {
        return $this->render('MyTestHomepageBundle::index.html.twig');
    }

    /**
     * Cached user specific content
     *
     * @param integer $myTestUserId
     *
     * @return \Symfony\Component\HttpFoundation\Response
     *
     * @Route("/test_user_cached/{myTestUserId}", name="homepage_user_specific_content")
     */
    public function userSpecificContentAction($myTestUserId)
    {
        $response = $this->render('MyTestHomepageBundle::userSpecificContent.html.twig', array('userId' => $myTestUserId));
        $response->setPublic();
        $response->setSharedMaxAge(3600);

        return $response;
    }
}

这是你的 index.html

<!DOCTYPE html>
<head></head>
<body>

<h1>My Test homepage - {{ "now"|date("F jS \\a\\t g:i:s") }}</h1>
{{ render_esi(url('homepage_user_specific_content')) }}
</body>

和 userSpecificContent.html.twig

UserId: {{ userId }}  - {{ "now"|date("F jS \\a\\t g:i:s") }}
于 2013-07-31T19:03:24.483 回答
0

只要您的 ESI 片段响应标头表明它不可缓存,varnish 就不会缓存它。这是一个典型的用例——使用 esi 指令缓存父页面,而不是缓存包含的 esi 包含。这些文档在包含 ESI 的父页面上告诉您,使用 s-maxage 以便浏览器不考虑页面可缓存,只考虑清漆。根据我的经验,您还应该从包含 esi 标签的响应中删除 etag 和 last modified 标头,因为它们不会响应 esi 包含的片段内容中的更改。

如果您不想在后端执行此操作,您可以在 vcl_fetch 中执行此操作(未 linted):

if (beresp.ttl > 0 && beresp.do_esi) {
   set beresp.http.Cache-Control = "s-maxage=" beresp.ttl; 
   unset beresp.http.etag;
   unset beresp.http.last-modified;
   /* Optionally */
   unset beresp.http.expires;
}
于 2013-08-01T21:29:00.800 回答