使用查询参数进行复合 Varnish URL 过滤

使用查询参数进行复合 Varnish URL 过滤

我有一个 WordPress 实例,前面有 Varnish,我wp-login.php使用以下方法阻止通过 VCL 进行访问:

sub vcl_recv {
    # block outside access to login
    if (req.url ~ "wp-admin" && !client.ip ~ white_list) {
        return (synth(404, "Page not found"));
    }
 }    

仅供参考,white_list这只是一个包含白名单 IP 列表的文件。到目前为止,这已经非常有效了。

我的客户最近请求使用 WordPress 保护页面来创建伪密码保护页面。我发现此方法用于/wp-login.php?action=postpass验证密码。由于我的白名单阻止了wp-login.php部分(不是全部,这很奇怪)请求,结果返回 404。

这意味着所有到 的请求/wp-login.php?action=postpass都应通过,而所有到 的请求wp-login.php(其中请求 IP 与 不匹配)white_list都应被拒绝。我一开始的做法是:

sub vcl_recv {
    # allow wp protected pages
    if (req.url ~ "wp-login" && req.url ~ "\?action\=postpass$") {
      return(pass);
    } else if (req.url ~ "wp-(admin|login)" && !client.ip ~ white_list) {
       return(synth(404, "Page not found"));
    }
}

在我看来,这应该可行,但实际上却不行。按原样,此规则允许所有访问,而wp-login.php不管white_list。我暂时删除了&& !client.ip ~ white_list以保持阻止,但我很困惑,为什么该条件部分会评估为 false,而它之前是可以工作的。

相关内容