【问题标题】:How to manipulate ESI URLs at Varnish to include user specific context?如何在 Varnish 中操作 ESI URL 以包含用户特定的上下文?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • ESI 提取独立于父提取,因此在父提取期间看不到设置的标头。因此,我无法在 ESI 提取中接收在父提取期间设置的 HTTP 标头。我正在寻找一种可以在 ESI 请求中设置参数/标头的解决方案。
  • 谢谢!这在某种程度上是有用的。但是,它涉及设置一个固定的 Authorization 标头。就我而言,标头应该从父请求本身继承授权。我正在研究 Varnish 的源代码,以了解有关允许 ESI 参数的更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 2020-08-29
  • 2011-10-03
  • 2021-12-16
  • 2010-09-28
相关资源
最近更新 更多