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

14

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

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

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

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

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

rpayanm
источник

Ответы:

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(),
  ];
}

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

Zuzuesque
источник
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.

VishnuMoorthy
источник