Шаблон, который рисует разное в зависимости от куки, под кэшем ведёт себя не так, как задумано. Он рисует вариант для первого посетителя — того, чей запрос попал на MISS, — и этот вариант получают все до следующего сброса. Два случая, которые мы встречали на нескольких сайтах.

Это девятая часть цикла «Кэш страниц без MISS».

Обычный код плашки согласия:

<?php if (!isset($_COOKIE['cookie_agree'])) : ?>
    <div class="cookie-bar">…</div>
<?php endif; ?>

Под кэшем исход зависит от первого посетителя. Пришёл новый — плашку получат все, и закрыть её навсегда нельзя: после согласия страница снова приходит из кэша с плашкой. Пришёл тот, кто уже соглашался, — плашку не увидит никто, включая новых.

Лечение — рисовать плашку всегда, а убирать маленьким встроенным скриптом до отрисовки:

<div class="cookie-bar" id="cookie-bar">…</div>
<script>
  if (document.cookie.indexOf('cookie_agree=') !== -1) {
    document.getElementById('cookie-bar').remove();
  }
</script>

Скрипт синхронный и стоит сразу после плашки: она удаляется до первой отрисовки и не мелькает.

Язык и маска телефона

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

Лечение — язык в ключ кэша. От него зависят не только маска, но и телефоны в шапке и тексты — это действительно другая страница. Цена — вдвое больше ячеек (пятая часть), и прогревать надо все (тридцать четвёртая часть).

Общее правило

  • разметка не зависит от куки — проблемы нет;
  • зависит, и вариантов мало (язык, регион) — кука в ключ;
  • зависит, и это личное состояние (согласие, сравнение) — сервер рисует одно и то же, клиент правит по куке.

Видите на сайте чужие настройки или вечную плашку?

Пришлите адрес — найду, какая разметка запеклась в кэш.

· полезно?
АЧ
Алексей Чикун веб-разработчик, команда TRIOHEAD

Делаю сайты и сервисы целиком: от вёрстки до сервера. Пишу о том, что проверил на своих проектах.

Комментарии

// загружаю комментарии…

Комментарии публикуются после проверки. Ссылки и HTML не принимаются.