我正在尝试使用Varnish来缓存一个页面,该页面上有一些用户特定的文本和链接。缓存此类页面的最佳方法是Edge Side Includes。
上下文
我的网络应用程序是RESTful,并且不支持会话甚至cookie。从某种意义上说,每个源URL都是完整的,它包含一个用户特定的查询参数,以便能够识别唯一用户。在Web应用程序中看到大多数访问的页面是列表页面。我只需要在标题中显示用户的电子邮件,并且页面上的链接也必须提前携带用户特定的查询参数,以便模拟登录的行为。除了标题和内部链接之外,每个用户的页面内容应该是相同的。
我尝试在页面上的这些区域使用<esi:include />
但很明显,无法在页面源中包含用户特定的参数(否则第一个用户特定的匹配将使用第一个用户的参数进行缓存并提供服务对于每个后续用户都是一样的)。此外,我尝试在Varnish的vcl_recv
子例程中删除用户特定参数,并将其暂时存储在req.http.X-User
之前的lookup
标题中。每个源URL都使用req.url
进行哈希处理,该req.http.X-User
不包含任何特定于用户的参数,因此不会为每个唯一用户创建重复的缓存对象。
问题
我想从{{1}}读取用户特定参数,并通过将每个ESI URL的此用户特定值添加为查询参数来读取用户特定的ESI请求。我没有看到一种方法可以在源请求和包含ESI请求之间共享查询参数。有人可以帮忙吗?
我试图在下图中描述我的目标:
答案 0 :(得分:0)
我想你的问题是ESI调用本身将被缓存。在URL中包含任何查询字符串。
我无法记住具体细节,但我认为您可以通过ESI请求获取Varnish传递cookie,因此您可以将值存储在cookie中(加密?)然后可以通过处理ESI调用的任何内容来读取
或许你可以让它通过HTTP标头通过?在这种情况下,可以直接从HTTP头参数
中读取它