【问题标题】:Varnish / VCL gurus: How to pass request body using Varnish fetch?Varnish / VCL 大师:如何使用 Varnish fetch 传递请求正文?
【发布时间】:2026-01-31 02:00:01
【问题描述】:

恐怕我对 varnish 还很陌生,但我有一个问题,我无法找到任何地方的解决方案(目前): Varnish 设置为缓存 GET 请求。我们有一些请求有很多参数,我们决定将它们传递到请求的正文中。这在我们绕过 Varnish 时工作正常,但是当我们通过 Varnish(用于缓存)时,请求在没有正文的情况下传递,因此 Varnish 后面的服务失败。

我知道我们可以使用 POST,但我们想获取数据。我也知道,如果我们使用传递模式,Varnish 可以传递请求正文,但据我所知,在传递模式下发出的请求不会被缓存。我已经在 url 中添加了一个哈希,这样当一切正常时,我们实际上会从缓存中获取正确的数据(就 url 而言,调用看起来都是一样的)。

现在的问题是“只是”如何重写 vcl_fetch 以将请求正文传递给网络服务器?欢迎任何提示和提示!

提前致谢

乔恩

【问题讨论】:

  • 那么您想要带有请求正文的 HTTP GET 请求吗?直到我在这个网站上发现一个问题,我才认为这是可能的:*.com/questions/978061/http-get-with-request-body。这是可能的,但不推荐。我可以想象清漆没有实现这种情况....
  • 我知道这是不推荐的,但它是允许的......并且有助于获得圆形 url 长度限制。 varnish 在 pass 模式下支持它,但不缓存结果。似乎他们在获取模式下不支持它(还没有?)......在获取模式下,响应可以被缓存。 :((

标签: varnish


【解决方案1】:

我不认为你可以,但是,即使你可以,这也是非常危险的:Varnish 不会将请求正文存储到缓存或哈希表中,因此它无法看到 2 个请求之间的任何区别相同的 URI 和不同的正文。

我还没有听说过用于读取请求正文的 VCL 密钥,但如果存在,您可以将其传递给 req.hash 以区分请求。

无论如何,请求正文只能与 POST 或 PUT 一起使用...并且不应缓存 POST/PUT 请求。

请求正文应该向服务器发送数据。缓存用于获取数据...

我不知道细节,但我认为您的流程中存在设计问题...

【讨论】:

  • PS : 如果你传递了你的请求(VCL "pass" 事件),那么一切都会按预期工作,但不会被缓存。
【解决方案2】:

我不确定我的问题是否正确,但是如果您尝试以某种方式与请求正文进行交互,这对于 VCL 是不可能的。您没有任何 VCL 变量/子程序来执行此操作。

您可以在此处(或在 man vcl 中)找到 VCL 中可用的变量列表:

我同意 Gauthier 的观点,您的系统似乎存在设计问题。

'希望有帮助。

【讨论】:

  • 那个链接失效了