Перейти к основному содержанию

Drupal 9 — отключить кэширование определённых страниц

Drupal 9

Сегодня отключим кэш на нужных нам страницах в Drupal 9. Зачем отключать? Я вижу, как минимум две причины:

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

У меня есть пример динамической страницы. На ней определяется IP адрес пользователя, и кэшировать эту страницу не нужно:

Ваш IP адрес

Мне не очень хотелось лезть в код, воспользуюсь готовыми модулями.

CacheExclude

Первым на глаза попался модуль CacheExclude. Очень простой модуль, вот только версия для Drupal 7. Не отчаиваемся, тыкаем в ссылку View all releases. И там есть релиз для Drupal 8, уже лучше.

cacheexclude 8.x-1.0

В комментариях написано, что в релиз добавлена поддержка Drupal 9: Works with Drupal: "^8 || ^9". Там разработчики просто прописали поддерживаемую версию "core_version_requirement: ^8 || ^9". Вот только этого недостаточно, в этом релизе есть один маленький но очень большой баг, который может уронить сайт. Но не отчаиваемся, качаем и устанавливаем модуль, потом включаем.

В конфигурации системы появляется новый пункт: Cacheexclude settings (/admin/config/system/cacheexclude).

drupal

Здесь можно исключить из кэширования тип материала или указать отдельные страницы. Я радостно указал свои странички, нажал "Сохранить конфигурацию" и уронил сайт с ошибкой:

Uncaught PHP Exception Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException: "You have requested a non-existent service "path.alias_manager". Did you mean this: "path_alias.manager"?" at C:\web\drupal8\core\lib\Drupal\Component\DependencyInjection\Container.php line 156

В Drulal 9 компонент "path.alias_manager" заменили на "path_alias.manager", о чём нам в ошибке и говорится. Чтобы починить сайт (а лучше не уронить) будем править. Редактируем файл \modules\cacheexclude\src\EventSubscriber\CacheexcludeSubscriber.php. Находим строку:

$current_path_alias = \Drupal::service('path.alias_manager')->getAliasByPath($current_path);

меняем на:

$current_path_alias = \Drupal::service('path_alias.manager')->getAliasByPath($current_path);

drupal

После этого модуль заработал.

Advanced Page Expiration

Ещё один модуль, который я попробовал: Advanced Page Expiration (APE). Если вам необходимо более тонко настраивать время жизни кэша страниц, чем позволяет стандартный функционал Drupal, или если вы используете внешние системы кэширования, то стоит попробовать этот модуль Он позволяет лучше управлять заголовком Cache-Control, чем это реализовано в Drupal. И он тоже позволяет отключить кэш на определённых страницах.

Скачиваем, устанавливаем, включаем. На страничке Производительность вместо стандартной настройки кэша появляется ссылка "Configure page caching strategy with APE".

drupal

Переходим (/admin/config/development/performance/ape). Сразу видим поле Pages to exclude from caching. Вот здесь и можно указать страницы, которые не нужно кэшировать.

drupal

А вот то что не бросается в глаза — поле Global page expiration. Вроде то же самое, что и было в Drupal, да не совсем. Вариантов выбора стало гораздо больше, от 1 минуты до года.

drupal

В разделе ALTERNATIVE PAGE CACHING можно настроить альтернативный кэш для определённых страниц. В разделе SERVER RESPONSE CACHING можно отключить кэш для редиректов и страницы 404.

drupal

Заключение

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

Теги

 

Похожие материалы

Drupal 8/9 — PHP код на странице

В drupal 8 и 9 выпилили возможность вставить PHP код на страницу. С одной стороны это правильно и безопасно, с другой стороны — иногда нужно. Для того чтобы вернуть возможность вставить PHP потребуется установить расширение.

Теги