Как я могу предотвратить кэширование определенной страницы?


14

Я активировал кеш на своем сайте Drupal 8, и, конечно, все страницы кэшируются, как и ожидалось.

Тем не менее, я хотел бы, чтобы определенная страница обходила этот кеш.

В моем контроллере я построил страницу следующим образом:

public function myPage() {
  return [
    '#markup' => time(),
  ];
}

Как я могу сказать Drupal не кэшировать мою страницу?

Ответы:


31

Для Drupal 7:

В Drupal есть функция drupal_page_is_cacheable (), которую можно использовать для установки страницы, которая не кэшируется.

Вот документация: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_page_is_cacheable/7

Для Drupal 8:

// Deny any page caching on the current request.    
\Drupal::service('page_cache_kill_switch')->trigger();

Тогда код:

public function myPage() {
  \Drupal::service('page_cache_kill_switch')->trigger();
  return [
    '#markup' => time(),
  ];
}

Как обычно, очистите кеш, как только это будет сделано.


19

Отключить кеш для конкретной страницы

Отключить кэш для пользовательской страницы из объявления маршрута. Если вы хотите отключить кэш для пользовательского контроллера (Custom module), у вас есть no_cacheопция (YOUR_MODULE.routing.yml). Пример: Файл: mymodule.routing.yml

mymodule.myroute:
  path: '/mymodule/mypage'
  defaults:
    _controller: '\Drupal\mymodule\Controller\Pages::mypage'
    _title: 'No cache page'
  requirements:
    _access: 'TRUE'
  options:
    no_cache: 'TRUE'

Добавлена ​​опция маршрута no_cache, чтобы пометить ответы маршрута как не кэшируемые


11

В Drupal 8 вы можете упоминать кэш как max-age, пока вы не захотите, чтобы вывод вашей страницы был кэширован. Для удаления кеша конкретной страницы (страницы контроллера) напишите 'max-age' => 0,.

public function myPage() {
  return [
   '#markup' => time(),
   '#cache' => ['max-age' => 0,],    //Set cache for 0 seconds.
  ];
} 

2

Если вам нужно что-то сделать с модулем contrib, вы можете использовать RouteSubscriber для решения проблемы с кешем. Вам нужен сервис ... или просто запустить, drupal grесли у вас есть друпальная консоль.

 namespace Drupal\mymodule\Routing;

 use Drupal\Core\Routing\RouteSubscriberBase;
 use Symfony\Component\Routing\RouteCollection;

 class RouteSubscriber extends RouteSubscriberBase {

/**
 * {@inheritdoc}
 */
protected function alterRoutes(RouteCollection $collection) {
  // Find the route you need ...
  if ($route = $collection->get('some.contrib.route')) {
    $options = $route->getOptions();
    $options['no_cache'] = TRUE;
    $route->setOptions($options);
  }
 }
}

дополнительную информацию см. https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones


1

Вы можете использовать этот модуль, чтобы избежать кеша drupal, а также кеша на стороне сервера, например, лака https://www.drupal.org/project/ape

Это работает для меня в кэше Varnish на сервере acquia.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.