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