2

我正在尝试使用 Varnish 来缓存包含一些用户特定文本和链接的页面。缓存此类页面的最佳方法是通过Edge Side Includes

语境

我的 Web 应用程序是 RESTful 的,不支持会话,甚至不支持 cookie。从某种意义上说,每个源 URL 都是完整的,因为它包含一个用户特定的查询参数,以便能够识别一个唯一的用户。在 Web 应用程序中访问最多的页面是列表页面。我只需要在标题中显示用户的电子邮件,页面上的链接还必须提前携带用户特定的查询参数,以模拟登录行为。除了标题和那些内部链接之外,每个用户的页面内容应该是相同的。

我试图<esi:include />在页面上使用这些区域,但显然不能在页面源中包含用户特定的参数(否则第一个用户特定的命中将与第一个用户的参数一起缓存,并为每个后续用户提供相同的服务)。此外,我尝试在vcl_recvVarnish 的子例程中剥离用户特定参数并将其临时存储在标题中,例如req.http.X-User就在lookup. 每个源 URL 都使用不包含任何用户特定参数的散列,req.url因此不会为每个唯一用户创建重复的缓存对象。

问题

我想req.http.X-User通过将此用户特定值添加到每个 ESI URL 作为查询参数来读取用户特定参数并散列用户特定 ESI 请求。我看不到一种可以在源请求之间共享查询参数的方式,并且它包含 ESI 请求。有人可以帮忙吗?

我试图在下图中描述我的目标: 在此处输入图像描述

4

1 回答 1

0

我猜你的问题是 ESI 调用本身将被缓存。在 URL 中包含任何查询字符串。

我不记得具体细节,但我认为您可以让 Varnish 通过 ESI 请求传递 cookie,因此您可以将值存储在 cookie(加密?)中,然后可以通过处理 ESI 调用的任何内容读取该值。

或者,也许您可​​以让它通过 HTTP 标头?在这种情况下,可以直接从 HTTP 标头参数中读取

于 2013-10-04T13:40:20.760 回答