检测清漆钩子中的返回码(模式)

vcl_recv我决定是否通过或查找基于cookie的存在:

 sub vcl_recv { if (req.http.Cookie ~ "(JSESSIONID=)" ) { /* do not cache logged in users */ return (pass); } return (lookup); } 

vcl_fetch我微调caching的一些网页:

 sub vcl_fetch { /* custom rules block */ if (req.url ~ "^/foo") { set beresp.ttl=30s; } if (req.url ~ "^/bar") { set beresp.ttl=1m; } if (req.url ~ "^/123") { set beresp.ttl=10m; } return (deliver); } 

我如何知道vcl_fetch是否处于通过或查找模式? 我希望能够避免运行“自定义规则块”,如果我在查找模式,因为login的用户将无论如何运行在通行模式,所以这些规则不适用于他们。

您始终可以在vcl_recv中设置自定义标题:

 sub vcl_recv { if (req.http.Cookie ~ "(JSESSIONID=)" ) { /* do not cache logged in users */ set req.http.x-my-mark = "passed"; return (pass); } return (lookup); } #... sub vcl_fetch { if (req.http.x-my-mark == "passed") { /* custom rules block */ if (req.url ~ "^/foo") { set beresp.ttl=30s; } if (req.url ~ "^/bar") { set beresp.ttl=1m; } if (req.url ~ "^/123") { set beresp.ttl=10m; } } return (deliver); } 

但是我认为把你的login放在vcl_pass [1]上,或者只是在vcl_fetch上执行原始的检查会更简单:

 sub vcl_fetch { if (req.http.Cookie ~ "(JSESSIONID=)") { /* custom rules block */ if (req.url ~ "^/foo") { set beresp.ttl=30s; } if (req.url ~ "^/bar") { set beresp.ttl=1m; } if (req.url ~ "^/123") { set beresp.ttl=10m; } } return (deliver); } 

[1] https://www.varnish-software.com/static/book/VCL_functions.html#vcl-vcl-pass