我想知道是否存在诸如私有 ESI 片段之类的东西。在我阅读的文档中:
- “设置共享的最大年龄 -这也将响应标记为公开”
- “一旦开始使用 ESI,请记住始终使用 s-maxage指令而不是 max-age。由于浏览器只接收聚合资源,它不知道子组件,因此它将遵守 max-年龄指令并缓存整个页面。而你不希望这样。”
我不完全了解我是否能够按用户缓存页面的某些部分。有人可以解释一下吗?
提前致谢!
我想知道是否存在诸如私有 ESI 片段之类的东西。在我阅读的文档中:
我不完全了解我是否能够按用户缓存页面的某些部分。有人可以解释一下吗?
提前致谢!
您可以基于每个用户缓存页面的某些部分。
他们的关键是清漆配置,您将共享的最大年龄设置为您的 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") }}
只要您的 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;
}