Symfony 3.4 http-кеш, всегда Cache-Control: max-age = 0, необходимо перепроверить, частный

Пробую в аннотации

 * @Cache(expires = "+10 hours", public=false) 

или в контроллере

$maxAge = 60*60;
$response->setExpires(Carbon::create()->addHour());
$response->setSharedMaxAge($maxAge);
$response->setPublic();
$response->setMaxAge($maxAge);

И еще есть Cache-Control: max-age=0, must-revalidate, private

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

Я добавил FOS\HttpCacheBundle\FOSHttpCacheBundle()

(просто добавьте) Надеюсь, что он переопределит кеш Symfony и разрешит частную отправку кеша - но ничего не изменится.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
9
0
3 129
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы используете обратный прокси, такой как Symfony? https://symfony.com/doc/3.4/http_cache.html#symfony-reverse-proxy

Кроме того, в вашем примере у аннотации public = false, а у контроллера public true.

Другая возможная проблема может заключаться в том, что ваш веб-сервер (Apatche и т. д.) Настроен на добавление этого заголовка или параметр в вашем файле .htaccess указывает это.

Ответ принят как подходящий

Такое поведение является новым в Symfony 3.4 и 4.0. Если сеанс пользователя был инициализирован, он всегда будет устанавливать заголовки, как описано в вашем вопросе.

Представленный в Symfony 4.1, вы можете переопределить это поведение. Однако, поскольку это новая функция, она не будет перенесена в Symfony 3.4.

$response->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER, 'true');

Вы можете прочитать об этом в документации Symfony: Кэширование HTTP и пользовательские сеансы

Я читаю это неправильно, или это означает, что в v3.4 невозможно использовать ESI с HTTP-кешем, если у вас есть активный пользовательский сеанс?

userfuser 20.09.2018 14:16

Видимо, вы правильно читаете. Это нетривиальный перерыв B / C для настроек на основе ESI, можно даже не кэшировать ответы, которые не зависят от пользователя, когда существует cookie сеанса (независимо от фактического состояния входа в систему). Отчет об ошибке: github.com/symfony/symfony/issues/29151

MicE 08.11.2018 23:58

Вероятно, лучший способ сделать это - использовать Украшение сервиза, но пока я предпочел грязный путь.

В моем случае мне просто нужны были общие кешированные заголовки для конкретного контроллера.

Workaroung для Symfony 3.4. *:

Создайте прослушиватель с более низким приоритетом, чем Symfony\Component\HttpKernel\EventListener\SessionListener в services.yml (не знаю, рекомендуется ли это):

AppBundle\Listener\ResponseListener:
    tags:
        - { name: kernel.event_listener, event: kernel.response, priority: -1001 }

Затем в AppBundle\Listener\ResponseListener:

<?php

namespace AppBundle\Listener;

use Symfony\Component\HttpKernel\Event\FilterResponseEvent;

class ResponseListener
{
    public function onKernelResponse(FilterResponseEvent $event)
    {
        $response = $event->getResponse();

        $controller = $event->getRequest()->attributes->get('_controller');
        $requiredAssetAction = "AppBundle\Controller\Website\AssetsController::assetAction";

        if ($controller == $requiredAssetAction) {
            $response->headers->addCacheControlDirective('max-age', 900);
            $response->headers->addCacheControlDirective('s-maxage', 900);
            $response->headers->addCacheControlDirective('must-revalidate', true);
            $response->headers->addCacheControlDirective('public', true);
            $response->headers->removeCacheControlDirective('private');

        }

        $event->setResponse($response);
    }

}

Другие вопросы по теме