varnish - правило vcl для включения esi только для зарегистрированных пользователей
Я хочу включить ESI только для зарегистрированных пользователей. Вышедшие пользователи должны обслуживаться целой страницей через кеш.
Я написал ниже vcl для этого. Проблема заключается в том, что, как только он кэширует страницу для входа в систему или для выхода из системы, он отображается одинаково для всех.
vcl_recv {
if (req.http.Cookie ~ "loggedIn") {
if (req.url ~ "^/esi")
{
return (pass);
}
if (req.url ~ "page"){
return (lookup);
}
return (pipe);
}
return (lookup);
}
sub vcl_pipe {
set bereq.http.connection = "close";
}
sub vcl_fetch {
if (req.url ~ "page"){
set beresp.do_esi = true;
set beresp.ttl = 1d;
return (deliver);
}
set beresp.ttl = 1d;
return (deliver);
}
Похоже, что одним из решений является использование vcl_hash для комбинации URL и cookie LoggedIn, которые имеют два значения 0 или 1. Пожалуйста, предложите.
1 ответ
- Сначала вы должны обнаружить cookie и получить его значение
- Затем вы должны передать запрос в vcl_recv & vcl_fetch. Когда файл cookie вошел в систему.
- Вы можете проверить это двумя способами, например, проверить значение файла cookie или проверить, установлен ли установленный файл cookie.
Я даю ответ, используя значение cookie, как показано ниже
sub identify_cookie{ #Call cookie based detection method in vcl_recv if (req.http.cookie ~ "loggedIn=") { set req.http.loggedIn = regsub(req.http.cookie, "(.*?)(loggedIn=)([^;]*)(.*)$", "\3"); } } sub vcl_recv { call identify_cookie; #Used to get identify cookie and get its value if(req.http.loggedIn && req.url ~ "^/esi"){ #used to get value using cookie value return (pass); } if (req.url !~ "wp-(login|admin)" && req.http.Cookie !~ "loggedIn"){ #remove all the request cookie(s) except loggedIn and check for wordpress admin unset req.http.Cookie; } } sub vcl_fetch { if(req.http.loggedIn && req.url ~ "^/esi") { return (hit_for_pass); } if (req.url !~ "wp-(login|admin)" && beresp.http.set-Cookie !~ "loggedIn"){ #remove all the response cookie(s) except loggedIn and check for wordpress admin unset beresp.http.Set-Cookie; } }