在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