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 ответ

  1. Сначала вы должны обнаружить cookie и получить его значение
  2. Затем вы должны передать запрос в vcl_recv & vcl_fetch. Когда файл cookie вошел в систему.
  3. Вы можете проверить это двумя способами, например, проверить значение файла cookie или проверить, установлен ли установленный файл cookie.
  4. Я даю ответ, используя значение 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;
        }
    }
    
Другие вопросы по тегам