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

Varnish:禁止带有任何GET参数的URL

秦博达
2023-03-14

我正在使用Varnish cache 6.0。6.有时我需要基于URL忽略GET参数和任何标题使缓存无效。我为此使用BAN命令。

获取用于检索内容的命令。他们得到的结果是不同的。

curl --user login:secret 'http://example.com/v1/account/123'
curl --user login2:secret2 'http://example.com/v1/account/123?origin=abc'

BAN命令禁止两个缓存。

curl -X BAN example.com -H "X-Ban: /v1/account/123"

清漆配置

 if (req.method == "BAN") {
    if (!client.ip ~ purge) {
      return (synth(405, "Not allowed"));
    }
    ban("obj.http.x-host == " + req.http.host + " && obj.http.x-url ~ " + req.http.X-Ban);
    return (synth(200, "Ban added"));
  }

但是,ban命令仅对第一个请求使缓存无效。第二个请求保持缓存状态。如何使以^/v1/account/123开头的所有内容无效?


共有1个答案

逄皓轩
2023-03-14

我已经在本地设置上测试了它,它看起来确实可以工作,不需要任何更改。

这是初始请求,您可以看到Age:35表示该项已在缓存中存储35秒。

➜  ~ curl -I localhost/v1/account/123\?origin=abc
HTTP/1.1 200 OK
Content-Type: text/plain
Date: Fri, 15 May 2020 07:26:59 GMT
Content-Length: 216
x-host: localhost
x-url: /v1/account/123?origin=abc
X-Varnish: 32788 32786
Age: 35
Via: 1.1 varnish (Varnish/6.0)
Accept-Ranges: bytes
Connection: keep-alive

下一个请求使用您在VCL中描述的确切语法发布禁令:

➜  ~ curl -X BAN localhost -H "X-Ban: /v1/account/123"
<!DOCTYPE html>
<html>
  <head>
    <title>200 Ban added</title>
  </head>
  <body>
    <h1>Error 200 Ban added</h1>
    <p>Ban added</p>
    <h3>Guru Meditation:</h3>
    <p>XID: 14</p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>

当我再次执行初始curl调用时,Age头被重置为零,这意味着页面没有从缓存中提供服务。这是理想的结果。

➜  ~ curl -I localhost/v1/account/123\?origin=abc
HTTP/1.1 200 OK
Content-Type: text/plain
Date: Fri, 15 May 2020 07:40:23 GMT
Content-Length: 213
x-host: localhost
x-url: /v1/account/123?origin=abc
X-Varnish: 16
Age: 0
Via: 1.1 varnish (Varnish/6.0)
Accept-Ranges: bytes
Connection: keep-alive

这是本例使用的完整VCL。请调整后端

请确保x-host

vcl 4.0;

backend default {
    .host="localhost";
    .port="8080";
}

acl purge {
    "localhost";
}

sub vcl_recv {
    if (req.method == "BAN") {
        if (!client.ip ~ purge) {
            return (synth(405, "Not allowed"));
        }
        ban("obj.http.x-host == " + req.http.host + " && obj.http.x-url ~ " + req.http.X-Ban);
        return (synth(200, "Ban added"));
    }
}

sub vcl_backend_response {
    set beresp.http.x-host = bereq.http.host;
    set beresp.http.x-url = bereq.url;
}
 类似资料:
  • 问题内容: 在swift 3中建议使用带参数的GET的哪种方法? 范例: 提前致谢 ! 问题答案: 示例如何使用请求。

  • 问题内容: 我已经看过以下SO问题,即使用AngularJS的$http服务通过GET请求发送数组,以及通过Angular $ http POST传递数据数组。但是那里建议的解决方案似乎对我不起作用。我的专门针对 数组对象 。 我有以下带有数组参数的AngularJS ajax调用 该调用生成的网址似乎不适用于我。我已经尝试了各种参数的化身,并且生成的网址(通过提琴手将其获取)如下。 我希望网址为

  • 可能是我犯了什么愚蠢的错误。在我使用配置身份验证后,通过Chrome登录后,会出现以下错误(在本文件的底部)。对于同样有效 当我有这个的时候- 这是我的密码- 注意-但是,如果我故意提供错误的凭据,它会说“坏凭据”。

  • 问题内容: 我是新手,所以我的代码可能会出现很多错误,但是我要实现的目标是将GET请求发送到带有 参数的服务器。鉴于我的函数有两个参数,我试图做到更多。我不确定如何将两者结合到实际的URLRequest中?到目前为止,这是我尝试过的 问题答案: 建立请求时,请求的主体没有,但是所有内容都放在URL上。要构建网址(并正确地将其转义), 您还可以使用. 唯一的窍门是,大多数Web服务都需要+转义字符百

  • 我是Node.js和Express的新手,我一直在做一个RESTful API项目,我试图在URL中发送一个带有多个参数的GET请求: 这是我的路线: 我是这样称呼它的: 而且我也尝试过 它最终会走这条路线: 那么,我写endpoint的方式是否错误?还是我要求的方式?

  • 这是来自3.7.4.2的N3797: 全局操作符delete[]只有两个参数,第二个参数的类型是std::size_t,这是一个常见的解除分配函数。37 37)此解除分配函数排除使用分配函数空运算符new(std::size_t,std::size_t)作为位置分配函数 这个说明对我来说不清楚。我想看看这种排除的真正例子。编译器将引发警告,或者我们遇到运行时错误?我一直在尝试编写如下内容: 我不知