0

我试图使用私有/公共缓存以避免检索用于构建主页内容的所有数据。这是安静的静态内容。

我试着那样做。

    $response->setMaxAge(600);
    // mark the response as either public or private
    $response->setPublic();
    $response->setPrivate();

    // set the private or shared max age
    $response->setMaxAge(2000);
    $response->setSharedMaxAge(2000);
    $response->setETag(md5($response->getContent()));
    $response->isNotModified($this->getRequest());
    // set a custom Cache-Control directive
    $response->headers->addCacheControlDirective('must-revalidate', true);

但是,我有一些小信息可以像语言和货币选择一样动态变化。

如果用户决定更改语言或货币,如何更改内容?

它目前适用于语言,因为 URL 与 home.site/fr 或 home.site/en 不同。

但是货币信息不在url中,其他信息如认证与否也不在url中。

那么如何使用 Http 缓存并保持用户操作的真实性呢?

谢谢你的帮助。

约尼

4

1 回答 1

4

使用 HTTP 缓存时,您必须将您的应用程序视为一个整体。

根据您的反向代理,默认策略是根据其 URI 缓存页面。ETag 用于发出条件请求以避免从后端获取实际数据,但它不会改变缓存策略的行为。

因此,使用您当前的设置,每次用户访问时,比方说example.net/fr,在定义的 2000 秒内,它将获得从您的后端检索到的第一个缓存内容,无论他选择何种货币。

如果您想优化您的性能,您需要减少以删除不太常见的信息。

在您的情况下,您可能需要缓存至少 2 种内容表示:

  1. 法郎 + 欧元
  2. 欧元 + 欧元

所以。

为什么?因为您不想缓存所有可能的表示,否则您的缓存将变得无用。

为了使您的缓存策略有效,您需要能够为最多的人缓存数据,因此如果您有一些像“欢迎{用户名}”这样的块,它将失败,因为您可能必须缓存一个表示您为每个用户提供的内容,这是错误的。

保留某种“欢迎{用户名}”块的最佳方法是使用 ESI,它允许您将布局拆分为多个块,每个块使用不同的缓存策略(或根本不缓存)。

你的问题是我打赌货币存储在某种cookie中。默认情况下,大多数反向代理(如 varnish)不会使用 cookie 缓存响应,因为它可能是一个主要的安全漏洞。

因此,您基本上有两个解决方案,定义您的自定义策略,使用 Varnish 或使用 HTTP 功能(自定义标头 + Vary)非常容易。

于 2013-10-14T18:38:05.907 回答