![Varnish 禁止查询字符串](https://linux22.com/image/707198/Varnish%20%E7%A6%81%E6%AD%A2%E6%9F%A5%E8%AF%A2%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我正在尝试在 Varnish 4 中设置禁令。我在 vcl_recv 中有这个:
ban("req.http.host == " +req.http.host+" && req.url ~ "+req.url);
return(synth(200, "Ban added"));
当我发出请求时,它确实说禁止添加,并且我确实使用 varnishadm 在 ban.list 中看到了它:
1499676469.672070 0 req.http.host == something.com && req.url ~ /some/path?q=*
除了它不起作用之外,什么都不会失效。如果我尝试禁止 path*,它似乎适用于“常规”文件,例如 path.css,但它似乎永远不会根据查询字符串使 URL 无效。我还需要做些什么才能让它考虑查询字符串吗?查询字符串非常难以阅读,充满了 % 代码,如果这很重要的话。
谢谢
答案1
我认为您正在寻找PURGE
。它会更有效,并且会使您在 PURGE 请求中请求的任何 URL 无效。在 中vcl_recv
添加:
if (req.method == "PURGE") {
# If not allowed then a error 405 is returned
if (!client.ip ~ purge) {
return(synth(405, "This IP is not allowed to send PURGE requests."));
}
return (purge);
}
接下来,使缓存中的页面无效:
curl -X PURGE http://127.0.0.1/your-super-request-with-params -H "Host: example.com"
如果您确实想要BAN
s(您真的必须这样做吗?),那么不要使用 REGEX 匹配 ( ~
) 来使特定 URL 无效,因为它很可能会将?
和其他查询参数解释为引擎标志。所以:
ban("req.http.host == " + req.http.host + " && req.url = " + req.url);
return(synth(200, "Ban added"));