Шаблон, который рисует разное в зависимости от куки, под кэшем ведёт себя не так, как задумано. Он рисует вариант для первого посетителя — того, чей запрос попал на MISS, — и этот вариант получают все до следующего сброса. Два случая, которые мы встречали на нескольких сайтах.
Это девятая часть цикла «Кэш страниц без MISS».
Плашка о cookie: у всех или ни у кого
Обычный код плашки согласия:
<?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>
Скрипт синхронный и стоит сразу после плашки: она удаляется до первой отрисовки и не мелькает.
Язык и маска телефона
На сайте с двумя языками язык страницы выводился в разметку из куки, а по нему форма выбирала маску и флаг телефона. Кука в ключ кэша не входила. Посетитель из другой страны получал страницу с чужой маской — и верный номер в своём формате форма отвергала.
Лечение — язык в ключ кэша. От него зависят не только маска, но и телефоны в шапке и тексты — это действительно другая страница. Цена — вдвое больше ячеек (пятая часть), и прогревать надо все (тридцать четвёртая часть).
Общее правило
- разметка не зависит от куки — проблемы нет;
- зависит, и вариантов мало (язык, регион) — кука в ключ;
- зависит, и это личное состояние (согласие, сравнение) — сервер рисует одно и то же, клиент правит по куке.
Видите на сайте чужие настройки или вечную плашку?
Пришлите адрес — найду, какая разметка запеклась в кэш.
// загружаю комментарии…