如何防止特定页面被缓存?


15

我已经在Drupal 8网站上激活了缓存,当然所有页面都按预期进行了缓存。

但是,我希望有一个特定的页面绕过该缓存。

在控制器中,我按如下所示构建了页面:

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

如何告诉Drupal不要缓存我的页面?

Answers:


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

禁用特定页面的缓存

从路由声明中禁用自定义页面的缓存。如果要禁用自定义控制器(“自定义”模块)的缓存,则可以 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”路由选项,以将路由的响应标记为不可缓存


12

在Drupal 8中,您可以将cache称为max-age,直到您希望对页面输出进行缓存为止。要删除特定页面(控制器页面)的缓存,请写入'max-age' => 0,

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

3

如果您需要对contrib模块做一些事情,可以使用RouteSubscriber来解决缓存问题。您需要服务...或者drupal gr如果有drupal控制台就可以运行。

 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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.