4

所以我第一次使用清漆。我花了很长时间阅读它是如何工作的,但我无法弄清楚如何有选择地清除缓存。

比如说我有这样的网址

/?account=123&url=google.com

和另一个喜欢

/?account=123&url=stackoverflow.com

我需要在哪里清除缓存account=123

我只能弄清楚发出 purge on

/?account=123&url=stackoverflow.com

只会使用 PURGE 方法清除 url 与传入 url 匹配的缓存。

任何帮助表示赞赏。

4

4 回答 4

4

所以这就是有效的。在清漆 3 中,选择性清除称为禁令。所以你需要使用

ban("obj.http.x-url ~ " + req.url);
于 2012-06-05T16:31:23.847 回答
3

We faced a similar problem and ended up using a separate X-Purge-Regex-URL request header for purging content using HTTP requests.

Here's the VCL we are using to accomplish this:

acl purge {
  "localhost";
  "10.1.1.0"/28;
}

sub vcl_recv {
  if (req.http.X-Purge-Regex-URL) {
    if (!client.ip ~ purge) {
      error 405 "Not allowed.";
    }
    ban_url(req.url);
    error 200 "Banned URL";
  }
}

In your case we could purge the content using curl -H "X-Purge-Regex-URL: True" --head "http://my.host.addr/?account=123"

Do note that ban_url() doesn't care about HTTP host. It purges all the matching URLs from all the hosts. If this isn't something you want you should use ban() to ban the content by using req.http.host and req.url.

于 2012-08-29T12:07:57.553 回答
1

HTTP PURGE 方法允许您清除特定的 url。

要使用 regexp 进行清除,您必须使用 telnet 连接到 varnish 管理端口或使用命令行工具 varnishadm。

通常你可以这样做

telnet localhost 6082

通过使用 telnet,在连接到 varnish 服务器后,您可以使用 purge 命令进行清除:

purge req.url ~ /?account=123

以上将清除每个匹配 "/?account=123" 的 url

如果您想像使用 HTTP PURGE 请求一样清除特定页面,则必须使用双等号而不是波浪号 (~)

purge req.url == /?account=123

您还可以清除整个域

purge req.http.host == yourdomain.com

或您域上的特定页面:

purge req.http.host == yourdomain.com && req.url ~ /?account=123
于 2012-04-10T13:15:47.547 回答
0

我不是清漆专家,但这对我有用:

acl purge {
  "localhost";
  "10.1.1.0";
}

sub vcl_recv {
  if (req.http.X-Purge-Regex-URL) {
    if (!client.ip ~ purge) {
      error 405 "Not allowed.";
    }
    ban_url(req.url);
    #error 200 "Banned URL";
  }
}

请注意,我注释掉了error 200 "Banner URL"- 在我的情况下是导致问题的原因。

于 2014-09-29T14:33:41.750 回答