Кэширование лаком/Drupal для зарегистрированных пользователей


Проблема

Лак кэширует страницы, когда я анонимно захожу на свой сайт.

У меня включен "Кэш страниц для анонимных пользователей", так что это ожидаемо.

Но когда я вхожу в систему, он продолжает загружать кэшированную страницу для страниц, которые я посетил, когда выходил из системы, поэтому пользовательское меню никогда не отображается, а кнопка входа в систему продолжает отображаться, даже если я вошел в систему.

Я, хотя лак не работал для зарегистрированных пользователей, и я использую система кэширования drupal по умолчанию, которая, как я думал, не работает для зарегистрированных пользователей? Как я могу предотвратить это?

Настройка Сервера

Стек LEMP - Сервер Ubuntu 12.04

APC + кэширование памяти

Лак

Настройки кэширования Drupal:

Кэширование страниц для анонимных пользователей ->включено

Минимальное время жизни кэша ->0

Срок действия кэшированных страниц - >6 часов

Настройки модуля Лакирования:

Кэш лаков очистка: Drupal по умолчанию

Я установил Лак, используя это руководство и этот конфигурационный файл лака: http://andrewdunkle.com/how-install-varnish-drupal-7

Кэширование Браузера

Я отключил кэширование браузера в Firefox, и я все еще получаю доступ к кэшированию на своей домашней странице, однако теперь меню загружается правильно. Что это означает?

Author: Dominic Woodman, 2013-11-06

2 answers

У вас есть два варианта:

Решение 1. Запретить кэширование в браузере

Чтобы браузер не сохранял и не использовал страницу повторно, вы должны убедиться, что Cache-Control:no-cache, must-revalidate, post-check=0, pre-check=0 находится на соответствующих (HTML) страницах.

Вы можете принудительно ввести этот заголовок в sub vcl_deliver. Просто убедитесь, что вы не помещаете этот заголовок в статические ресурсы (например, изображения, файлы CSS и JavaScript):

sub vcl_deliver {
  set req.http.Cache-Control = "no-cache, must-revalidate, post-check=0, pre-check=0";
}

Решение 2. Убедитесь, что файл cookie находится на ответ

Если вы хотите заставить браузер аннулировать свой кэш при каждом изменении файлов cookie (т.Е. при открытии сеанса), вы должны убедиться, что заголовок Vary: Cookie находится в ответе.

sub vcl_deliver {
  if (resp.http.Vary !~ "Cookie") {
    set resp.http.Vary = resp.http.Vary + ", Cookie";
    set resp.http.Vary = regsub(resp.http.Vary, "^,\s*", "");
  }
}

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

Safari (по крайней мере, v5, который является последним для Windows, а также для iPad 1 и некоторых более старых версий iPhone) имеет неприятную ошибку . Я рекомендую добавить следующее, чтобы отключить кэш браузера Safari:

sub vcl_deliver {
  if (resp.http.X-Generator ~ "Drupal" && req.http.user-agent ~ "Safari" && req.http.user-agent !~ "Chrome") {
    set resp.http.Cache-Control = "no-cache, must-revalidate, post-check=0, pre-check=0";
  }
}

Примечание: Это немного отличается от решений, предложенных в комментариях к сообщению об ошибке. Помещая вырезанные в vcl_deliver вместо vcl_fetch, мы избегаем необходимости разделять ячейки. Также обратите внимание, что, сопоставляя X-Generator ~ "Drupal", мы избегаем отключения кэша браузера для статических ресурсов.

Сегодня (ноябрь 2013) я воспроизвел это неправильное поведение на Safari 5.1.1 (Windows), 6.1 (Mac OS X 10.8 /Mountain Lion) и 7.0 (iOS 7).

 7
Author: znerol, 2013-12-02 22:08:51

Я выбираю второй вариант. Я добавил фрагмент в свой конфигурационный файл Vanish:

/etc/varnish/default.vcl

Я добавил его как отдельный отдельный фрагмент, в отличие от размещения функции if внутри уже существующего sub vcl_deliver.

 1
Author: Dominic Woodman, 2013-11-06 15:07:46