Как заставить Лак игнорировать, а не удалять куки

Я хочу использовать Varnish для кэширования определенных страниц даже при наличии файлов cookie. Есть 3 варианта, о которых мне нужно позаботиться:

  1. Анонимный пользователь просматривает какую-то страницу
  2. Зарегистрированный пользователь просматривает некоторую страницу с легкой настройкой. Все эти настройки хранятся в подписанном файле cookie и динамически заполняются Javascript. Заголовок var-cookie http не установлен.
  3. Зарегистрированный пользователь просматривает некоторую страницу с настроенными данными из базы данных. Заголовок var-cookie http установлен.

Ожидаемое поведение будет:

  1. Кэшируйте страницу. Это самый простой сценарий для Varnish.
  2. Кэшируйте страницу и не удаляйте cookie, потому что это требуется для некоторой логики Javascript.
  3. Никогда не кэшируйте эту страницу, потому что var-cookie сигнализирует о том, что содержимое куки повлияет на вывод этой страницы.

Я прочитал некоторые документы по Varnish, и я не могу сказать, является ли это поведением по умолчанию или есть какая-то настройка, которую я должен сделать в VCL, чтобы это произошло.

2 ответа

По умолчанию Varnish не кэширует запросы с заголовком Cookie:

http://varnish-cache.org/svn/trunk/varnish-cache/bin/varnishd/default.vcl

  sub vcl_recv {
(...)
  if (req.http.Authorization || req.http.Cookie) {
        /* Not cacheable by default */
        return (pass);
    }
    return (lookup);

Вам нужно кодировать поведение, которое вы хотите в конфигурации. Помните, что Cookie - это часть запроса клиента, а не "страница" (объект, на самом деле). "Страница" (объект) поставляется с заголовком "Set-Cookie", который будет кэшироваться.

Кроме того, "Vary: Cookie" не означает "не кэшировать". Это означает кэширование одного объекта для каждого полученного значения Cookie.

Если ваше приложение не генерирует контент, основанный на Cookie, возможно, его можно игнорировать:

-      if (req.http.Authorization || req.http.Cookie) {
+      if (req.http.Authorization) {

Сделайте несколько тестов, и вы освоите его. Надеюсь это поможет.

Если я вас правильно понимаю, вам не нужен определенный файл cookie как часть ключа - но вам нужно оставить его без изменений?

Вам нужно установить хеш в vcl_hash как req.url + req.http.host (и, возможно, другие), но не конкретный cookie.

Я думаю, что один из моих постов может помочь вам в правильном направлении: игнорирование GET-параметров в Varnish VCL

Другие вопросы по тегам