首页 > 解决方案 > Varnish 2.x 的“禁止”替代方案

问题描述

我们在Varnish 4.x中使用以下代码:

 if (req.http.X-Pool) {
    ban("obj.http.X-Pool ~ " + req.http.X-Pool);
 }

现在我们正在转向使用Varnish 2.x的 Fastly ,所以我们没有得到在 Varnish 2.x 中禁止的替代方案

标签: varnishvarnish-vclfastlyfastly-vcl

解决方案


有关 Fastly Varnish/VCL 的帮助,我建议通读这两个:

我通常还建议联系 support@fastly.com(他们是一群好人)。

关于您的问题,我对bans标准清漆不熟悉,但通读https://varnish-cache.org/docs/trunk/users-guide/purging.html#bans表明禁令是一种防止提供缓存的内容。

因此,解决方案取决于发生这种情况时您要实现的目标。

如果您只是想避免缓存,您可以pass从各种子例程中返回 a ,例如vcl_recvand vcl_hit(尽管从 vcl_hit 会导致hit-for-pass并且这将导致请求直接进入后端。

您还可以添加自定义逻辑vcl_recv或什至vcl_hit (如果您想确保请求的内容实际被缓存),然后您可以从那里触发一个error将您发送到vcl_error您可以构建合成响应的位置:

sub vcl_hit {
  #FASTLY hit

  if (<some_condition>) {
    error 700
  }
}
sub vcl_error {
  #FASTLY error

  if (obj.status == 700) {
    set obj.status = 404;

    synthetic {"
      <!doctype html>
      <html>
        <head>
          <meta charset="utf-8">
          <title>Error</title>
        </head>
        <body>
          <h1>404 Not Found (varnish)</h1>
        </body>
      </html>
      "};

    return(deliver);
  }

或者,vcl_recv或者vcl_hit您可能想要restart然后检查重新启动并做一些不同的事情(以某种方式更改后端或请求):

sub vcl_recv {
  #FASTLY recv

  if (req.restarts > 0) {
    if (<some_condition>) {
      // do something
    }
  }
}

推荐阅读