Назад | Перейти на главную страницу

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

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

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

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

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

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

По умолчанию 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