Varnish 不缓存带有特定词的 url

Varnish not to cache urls with specific word

我正在使用 Varnish 4.0.3 作为反向代理缓存和负载平衡器。
我想避免对以 /api/v1/ 开头的 link 或在其 link 中包含 feed 的任何 link 进行清漆缓存,并为来自后端的请求提供服务服务器直接。 我这样做了:

sub vcl_recv {
    if ((req.url ~ "^/api/v1/" || req.url ~ "feed") &&
        req.http.host ~ "api.example.com") {
        set req.backend_hint = apis.backend();
    }

但是根据访问日志,它服务于来自后端的第一个请求,然后它直接服务于来自清漆的新请求!我做错了什么吗?或者还有什么我需要做的吗?

应该是:

sub vcl_recv {
    if ((req.url ~ "^/api/v1/" || req.url ~ "feed") 
      && req.http.host == "api.example.com") {
        return (pass);
    }
}

return (pass) 将 Varnish 切换为匹配请求的 pass 模式。在传递模式下,Varnish 既不会将结果放入缓存,也不会从缓存中传递(总是与后端对话)。

一种微优化正在使用 == 运算符匹配 req.http.host。在这种情况下并不真正需要正则表达式匹配。