Отключение кэша страниц для ответа на перенаправление


Я реализовал условное перенаправление на своем сайте через подписчика события и вернул ответ на перенаправление. Это работает, но, я полагаю, из-за того, что модуль page_cache кэшируется для анонимных пользователей.

В основном это то, что я использую для настройки ответа на перенаправление:

public function checkRedirectStatus(GetResponseEvent $event) {
    if(shouldIRedirect()) {
        $response = new RedirectResponse('/redirect/path');
        $event->setResponse($response);
     }
}

Приведенное выше кэшируется независимо от того, возвращает ли оно значение true, если я не добавлю \Drupal::service('page_cache_kill_switch')->trigger();.

Поскольку это страница с довольно высоким трафиком, я обеспокоен обходом кэша для анонимных пользователи. Есть ли другие варианты, о которых я не знаю?

Если это относится к событию ядра REQUEST, насколько далеко идущее page_cache_kill_switch?

Спасибо за вашу помощь!

Author: Vecta, 2019-04-04

1 answers

Это не совсем ответ на ваш вопрос, но я чувствую, что это важная информация. Я сделал нечто подобное, но мне также не понравилось использовать переключатель "убить". В другой итерации я использовал trustedredirectresponse, который позволил мне по-другому решить проблему с кэшем. Это хорошо сработало для меня. Я понимаю, что это заставляет браузеры всегда обходить кэш при выполнении перенаправления, но само перенаправление кэшируется в drupal до тех пор, пока кэш $entity (моя зависимость от кэша) не будет признан недействительным.

$response_headers = [
  'Cache-Control' => 'no-cache, no-store, must-revalidate',
];

$response = new TrustedRedirectResponse($url, '302', $response_headers);
// In my case $entity is a content entity where my redirect $url is generated.
// In your case you'd add cache dependencies relevant to determining shouldIRedirect().
$response->addCacheableDependency($entity);
$event->setResponse($response);
 6
Author: sonfd, 2019-11-17 13:23:47