В vcl_recv
Я решаю, передать или выполнить поиск в зависимости от наличия файла cookie:
sub vcl_recv {
if (req.http.Cookie ~ "(JSESSIONID=)" ) {
/* do not cache logged in users */
return (pass);
}
return (lookup);
}
В vcl_fetch
Я тонко настраиваю кеширование для некоторых страниц:
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
нахожусь ли я в режиме прохождения или поиска? Я хотел бы иметь возможность избежать запуска «блока настраиваемых правил», если я нахожусь в режиме поиска, потому что зарегистрированные пользователи все равно будут работать в режиме прохода, поэтому эти правила к ним не применяются.
Вы всегда можете установить собственный заголовок в 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);
}
Но я думаю, что будет намного чище поставить логин на 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