当前位置: 首页 > 知识库问答 >
问题:

不能在清漆中净化整个域名,但是可以净化单个页面,我有配置错误吗?

穆洋
2023-03-14

我想我一定是在清漆配置上犯了一个错误。(我运行的是6.0.7版本。)以下是相关部分:

####----SECTION THREE: PURGE RULES----####
# Access Control List to define which IPs can purge content
acl purge {
        "localhost";
        "127.0.0.1";
        "<my home IP address>";
        "::1";
}

####----SECTION FOUR: PROCESSING RULES----####
sub vcl_recv {

# Do not allow purging from non-approved IPs
    if (req.method == "PURGE") {
        if (!client.ip ~ purge) {
            return (synth(405, "This IP is not allowed to send PURGE requests."));
}
    return (purge);
}

# Allow banning regexes
    if (req.method == "BAN") {
        if (!client.ip ~ purge) {
            return (synth(405, "This IP is not allowed to send BAN requests."));
    }
        ban("req.http.host == " + req.http.host + " && req.url ~ ^" + req.url);
        return (synth(200, "Ban added"));
    }
# Allow purging regexes
        if (req.method == "PURGE") {
        if (req.http.X-Purge-Method == "regex") {
        ban("req.url ~ " + req.url + " && req.http.host ~ " + req.http.host);
        return (synth(200, "Banned"));
    } else {
    return (purge);
    }     

(注意:在我的设置中,Varnish在端口6081上运行,前面是HAProxy。)

使用此设置,无论是从我的家庭IP地址还是运行Varnish的服务器,我都可以通过运行来清除Varnish缓存中的各个页面,例如:

curl -i -X PURGE https://example.com/page/

我还可以通过运行从Varnish缓存中清除整个域,例如:

curl -i -X BAN https://example.com

同样,我可以通过运行来清除Varnish缓存中的各个页面,例如:

curl -i -X PURGE http://<IP of Varnish server>:6081/page/ -H "Host: example.com”

我还可以通过运行从Varnish缓存中清除整个域,例如:

curl -i -X BAN http://<IP of Varnish server>:6081 -H "Host: example.com”

但我注意到,我无法通过运行以下任一操作清除整个域:

curl -i -X PURGE https://example.com

或:

curl -i -X PURGE http://<IP of Varnish server>:6081 -H "Host: example.com”

要清除整个域,我必须使用BAN。我不知道这是一个问题还是一个配置错误,但似乎是,因为尽管我读到清除并不是用来清除所有内容的,但我正在使用的Wordpress插件似乎试图通过向域发送清除请求来清除。com/* 当我点击“清除所有清漆缓存”按钮时。

坦率地说,这让我感到困惑。因为它既不能在插件本身中工作,也不能在命令行中尝试。我错过了什么?插件是不是过时了?Varnish以前能用这种方式清除整个缓存吗?如果有人给我指点,我将不胜感激。谢谢


共有1个答案

丁经略
2023-03-14

以下是VCL中清除逻辑的清理版本:

acl purge {
        "localhost";
        "127.0.0.1";
        "::1";
}

sub vcl_recv {
    if (req.method == "PURGE") {
        if (!client.ip ~ purge) {
            return (synth(405, "This IP is not allowed to send PURGE requests."));
        }
        if (req.http.X-Purge-Method == "regex") {
            ban("obj.http.x-url ~ " + req.url + " && obj.http.x-host ~ " + req.http.host);
            return (synth(200, "Banned"));
        }
        return (purge);
    }
}

sub vcl_backend_response {
    set beresp.http.x-url = bereq.url;
    set beresp.http.x-host = bereq.http.host;
}

sub vcl_deliver {
    unset resp.http.x-url;
    unset resp.http.x-host;
}

PURGEHTTP方法触发缓存失效。无任何标题返回(清除) ,这将使所使用的确切URL无效。

如果添加了X-Purge-method请求头,并将其设置为regex,则会出现正则表达式匹配。无法使用return(purge)使使用正则表达式的多个对象无效 ,需要禁止。

函数将ban表达式添加到ban列表中。此列表上的表达式与缓存中存储的所有对象匹配。匹配的将被删除。

您可以在Varnish服务器上使用以下命令查阅禁令列表:

varnishadm ban.list

禁止潜伏者是处理禁止列表的特殊线程,没有对请求上下文的访问权限。如果您希望这个线程从缓存中删除对象,根据请求参数,如URL或主机名,您需要应用som诡计。

如你所见,我建议的模式在obj.http.x-url上匹配

如果不这样做,禁令潜伏者将无法匹配对象,责任将转移到下一个请求。即使没有这些所谓的对潜伏者有利的禁令,禁令仍然会起作用,但没有那么有效。

第一个示例将使http://example.com/page从缓存中

curl -i -XPURGE -H "Host: example.com" "http://localhost:6081/page/"

下一个示例将使URL以开头的所有对象无效http://example.com/page

curl -i -XPURGE -H "Host: example.com" -H "X-Purge-Method: regex" "http://localhost:6081/page/"

最后一个示例将使example.com域的缓存中的所有对象无效:

curl -i -XPURGE -H "Host: example.com" -H "X-Purge-Method: regex" "http://localhost:6081/.*"

这是最后一个例子的禁止列表项:

root@varnish:/etc/varnish# varnishadm ban.list
Present bans:
1606393598.913178     0 -  obj.http.x-url ~ /.* && obj.http.x-host ~ example.com
1606393484.785268     3 C

如您所见,它匹配示例的所有URL。com主机。之后执行HTTP请求时,将看到Age:0响应头。这表示此响应已存储在缓存中零秒。这意味着禁令是成功的。

 类似资料:
  • 我在一个数字海洋Ubuntu虚拟机上运行一个独立的清漆实例,基本上运行良好。该设置用于加载一个位于其他任何地方的旧wordpress服务器。这工作得很好,但我很难清除内容。当谈到清除时,我的意思是使URL的缓存无效,以迫使清漆从后端获取新版本(只是为了确保我看到了一些关于清除/禁止的恼怒)。 我已经为清除设置了一个ACL,就我所能看到的varnishlog的清除被接受了-从WordPress博客的

  • 在我的php脚本中,我有一个简单的username/email exists条件,但是我想把这个错误(如果存在的话)放在html的某个地方,这样我就可以设置它的样式并将它放置在我的表单上。Echo只是把它放在左上角。我该怎么做?设置变量似乎不是最佳解决方案。

  • 我有这样的代码,它对名为'username'的变量的用户输入进行了净化: 我想对这个页面上的每个输入执行相同的过程,但我有大约12个不同的输入,因为它是一个注册表单。有没有更简单的方法来清理和检查每个输入,而不是对每个输入应用preg_replace()和if语句?

  • 有没有办法让HTML净化器保留在呈现的HTML中通常会看到的隐式空间? 例如,在以下情况下,您通常希望和之间有一个空格: 例1 例2

  • 我想为DropWizard创建几个yaml文件。其中一个包含敏感信息,另一个包含非敏感信息。 你能给我指出任何文档或例子如何在DropWizard中拥有多个配置吗?

  • 除了修改书籍的主题外,还可以通过配置 book.json 文件来修改 gitbook 在编译书籍时的行为,例如:修改书籍的名称,显示效果等等。