Перейти к содержимому

Cloudflare / CDN кэширует админку WordPress: почему вылетает сессия и как это исправить

Cloudflare / CDN кэширует админку WordPress: почему вылетает сессия и как это исправить

Короткий ответ: Если после включения Cloudflare (или другого CDN) вы начали постоянно выходить из админки WordPress, видите чужие данные или старую информацию — виновато агрессивное кэширование динамических страниц. Решение: отключить кэш для /wp-admin/* и wp-login.php через Page Rules в Cloudflare и проверить заголовки кэширования в .htaccess.


Почему CDN ломает админку

CDN вроде Cloudflare кэширует статический контент (CSS, JS, картинки) для ускорения загрузки сайта. Однако WordPress-админка — это динамическое приложение, где каждая страница:

  • Персонализирована под конкретного пользователя
  • Содержит nonce-токены (одноразовые ключи безопасности)
  • Управляет сессионными куками

Когда Cloudflare по ошибке начинает кэшировать страницы /wp-admin/*, возникают три классических симптома.

Симптом 1: Постоянный выход из системы

Вы залогинились, перешли на другую страницу админки — и снова форма входа. Причина: Cloudflare отдаёт кэшированную версию страницы логина вместо вашей сессионной страницы. WordPress проверяет куку wordpress_logged_in_*, но CDN возвращает сохранённую копию без этой проверки.

Симптом 2: Видны старые данные

Вы опубликовали запись, а в админке всё ещё отображается «черновик». Или обновили настройки плагина — а изменений не видно. Cloudflare отдаёт кэшированную (старую) версию страницы вместо свежей.

Симптом 3: Чужая админка

Редкий, но показательный случай — вы видите админку другого администратора вашего сайта. Это происходит, когда CDN кэширует динамический HTML страницы /wp-admin/ вместе с чужими nonce-токенами.


Как работает кэширование в Cloudflare: базовый принцип

Cloudflare кэширует только статические ресурсы, если явно не настроено иное. По умолчанию:

  • Кэшируются: CSS, JS, JPG, PNG, GIF, SVG, PDF, иконки шрифтов
  • Не кэшируются: HTML-страницы (динамический контент)

Важный нюанс. Если у вас включена опция Always Online или аггрессивный Cache Level (Standard+), Cloudflare может начать кэшировать HTML для домена по умолчанию, включая админку.

Проверить, какие страницы кэшируются, можно через заголовки ответа:

curl -I https://вашсайт.ру/wp-admin/ | grep -i cf-cache

Если видите cf-cache-status: HIT — страница админки кэшируется. Это неправильно.


Решение 1: Page Rules в Cloudflare (надёжнее всего)

Самый прямой способ — создать правило, которое запрещает кэширование для админки.

В панели Cloudflare:
1. Перейдите в Rules → Page Rules
2. Нажмите Create Page Rule
3. В поле URL введите: вашсайт.ру/wp-admin/*
4. Выберите настройку Cache Level: Bypass
5. Нажмите Save and Deploy

Повторите для страницы входа:

  • URL: вашсайт.ру/wp-login.php
  • Настройка: Cache Level: Bypass

⚠️ Бесплатный тариф Cloudflare даёт только 3 Page Rules. Если у вас больше правил, используйте решение №3 (проверьте через Cache Rules, доступные в бесплатном тарифе с 2023 года).


Решение 2: Cache Rules (современная альтернатива)

Начиная с 2023 года Cloudflare добавил Cache Rules — более гибкий механизм, который не расходует лимит Page Rules.

Создайте Cache Rule:
1. Rules → Cache Rules → Create rule
2. Field: Hostname — ваш домен
3. AND URI Path — starts with /wp-admin/
4. OR URI Path — equals /wp-login.php
5. Cache status: Bypass cache
6. Нажмите Deploy


Решение 3: HTTP-заголовки Cache-Control через .htaccess

Если у вас нет доступа к панели Cloudflare (например, CDN настроен клиентом), можно отправить правильные заголовки с сервера. Cloudflare уважает заголовки Cache-Control от origin-сервера.

Добавьте в .htaccess в корне сайта:

# Запретить кэширование админки
<IfModule mod_headers.c>
    <FilesMatch "wp-admin|wp-login\.php">
        Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0"
        Header set Pragma "no-cache"
        Header set Expires "Thu, 01 Jan 1970 00:00:00 GMT"
    </FilesMatch>
</IfModule>

После добавления проверьте заголовки:

curl -I https://вашсайт.ру/wp-admin/ | grep -i cache-control

Должны увидеть: Cache-Control: no-store, no-cache, must-revalidate, max-age=0


Решение 4: Кэширование только для авторизованных (плагины)

Если вам нужно кэширование для ускорения сайта (популярные решения: WP Rocket, W3 Total Cache, WP Super Cache) — настройте их правильно.

В WP Rocket:
— Настройки → Кэш → Галочка «Отключить кэш для авторизованных пользователей»
— Исключения: добавить /wp-admin/*

В W3 Total Cache:
— Performance → Page Cache → Advanced → «Don’t cache pages for logged in users»
— Вручную добавить /wp-admin/* в список исключений

Это нужно, чтобы ваш плагин кэширования не отправлял неверные заголовки в Cloudflare.


Решение 5: Отключить Always Online

Cloudflare Always Online — функция, которая показывает закэшированную версию сайта, если сервер origin недоступен. Это полезно для визиторов, но опасно для админки.

  1. В панели Cloudflare → Speed → Optimization
  2. Найдите Always Online
  3. Установите Off (или оставьте только для статики)
  4. Убедитесь, что в Include query strings нет wp-admin

Профилактика: что ещё проверить

1. Настройки WordPress (wp-config.php)

Убедитесь, что WP_HOME и WP_SITEURL ведут на правильный домен (без www vs с www — расхождение тоже вызывает редиректы):

define('WP_HOME', 'https://вашсайт.ру');
define('WP_SITEURL', 'https://вашсайт.ру');

2. SSL/TLS в Cloudflare

Используйте Full (strict), чтобы шифрование было полным. Если стоит Flexible — HTTPS-запросы приходят в Cloudflare как HTTP, и заголовки кэширования могут сбрасываться.

3. Cloudflare прокси (оранжевая туча)

Убедитесь, что на DNS-записи вашего домена в Cloudflare стоит оранжевая туча (прокси-режим). Серый режим (DNS only) отключает все функции Cloudflare, включая Page Rules.

4. Sucuri или другой WAF

Если перед Cloudflare стоит ещё один прокси (например, Sucuri), кэширование может накладываться дважды. Настройте исключения на каждом уровне.


Как проверить, что проблема решена

После применения одного из решений:

  1. Откройте инструменты разработчика в браузере (F12 → Network)
  2. Загрузите /wp-admin/ и проверьте заголовки ответа:
  3. cf-cache-status: BYPASS или DYNAMIC
  4. Cache-Control: no-cache или no-store
  5. Зайдите в админку — перейдите по 3-4 разным страницам
  6. Разлогиньтесь и залогиньтесь снова — сессия должна сохраняться
  7. Проверьте через curl с другого IP (например, через мобильную сеть):
curl -I https://вашсайт.ру/wp-admin/

Если cf-cache-status не равен BYPASS — повторите настройку.


Когда проблема не в Cloudflare

Иногда симптомы совпадают, но виноват не CDN. Проверьте:

  • Кэш браузера — очистите куки и кэш (Ctrl+F5 в Chrome)
  • Плагины кэширования — отключите временно (WP Rocket, W3 Total Cache, LiteSpeed Cache)
  • Хостинг — некоторые хостинги (Beget, Timeweb, Reg.ru) имеют встроенный Varnish/Nginx-кэш, который тоже может кэшировать админку
  • Redis / Memcached — объектное кэширование иногда конфликтует с сессиями

Для диагностики хостинга добавьте в .htaccess:

<IfModule mod_headers.c>
    Header set X-Cache-Debug "enabled"
</IfModule>

И проверьте, какой заголовок приходит в ответе.


Вывод

CDN — отличный инструмент для ускорения сайта, но админка WordPress должна быть всегда исключена из кэширования. Page Rules или Cache Rules в Cloudflare — универсальное решение, которое подходит для любого тарифа. Если нет доступа к Cloudflare — настройте заголовки Cache-Control через .htaccess. И всегда проверяйте результат через cf-cache-status в заголовках ответа.

Дата публикации: 5 июня 2026
Автор: Алексей, технический специалист веб-студии (GuruPractice)