【发布时间】:2013-10-11 12:44:39
【问题描述】:
我正在尝试使用 Varnish 来缓存包含一些用户特定文本和链接的页面。缓存此类页面的最佳方式是通过Edge Side Includes。
上下文
我的 Web 应用程序是 RESTful 的,不支持会话,甚至不支持 cookie。从某种意义上说,每个源 URL 都是完整的,因为它包含一个用户特定的查询参数,以便能够识别一个唯一的用户。在 Web 应用程序中访问最多的页面是列表页面。我只需要在标题中显示用户的电子邮件,页面上的链接还必须提前携带用户特定的查询参数,以模拟登录行为。除了标题和那些内部链接之外,每个用户的页面内容应该是相同的。
我尝试将<esi:include /> 用于页面上的此类区域,但显然无法在页面源中包含用户特定参数(否则第一个用户特定命中将与第一个用户的参数一起缓存并提供相同的服务对于每个后续用户)。此外,我尝试在 Varnish 的 vcl_recv 子例程中剥离用户特定参数,并将其临时存储在 req.http.X-User 之类的标头中,就在 lookup 之前。每个源 URL 都使用不包含任何用户特定参数的 req.url 进行哈希处理,因此不会为每个唯一用户创建重复的缓存对象。
问题
我想从req.http.X-User 读取用户特定参数,并通过将此用户特定值添加到每个 ESI URL 作为查询参数来散列用户特定 ESI 请求。我看不到一种可以在源请求之间共享查询参数的方式,并且它包含 ESI 请求。有人可以帮忙吗?
我试图在下图中描述我的目标:
【问题讨论】:
-
您找到解决此问题的方法了吗?
标签: caching varnish varnish-vcl