代码之家  ›  专栏  ›  技术社区  ›  Developer

symfony 3.4http缓存,始终缓存控制:max age=0,必须重新验证,私有

  •  4
  • Developer  · 技术社区  · 6 年前

    我试着注释

     * @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缓存并允许发送缓存私有化-但没有任何更改。

    3 回复  |  直到 6 年前
        1
  •  9
  •   Will Riches    6 年前

    从symfony 3.4和4.0开始,这种行为是新的。如果用户会话已初始化,它将始终按照问题中的说明设置标题。

    在symfony 4.1中引入,您可以重写此行为。不过,由于这是一个新功能,因此不会被移植到symfony 3.4。

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

    您可以在symfony文档中了解到这一点: HTTP Caching and User Sessions

        2
  •  0
  •   Raress96    6 年前

    你使用的是像symfony那样的反向代理吗? https://symfony.com/doc/3.4/http_cache.html#symfony-reverse-proxy

    另外,在您的示例中,注释具有public=false,而控制器将具有public true。

    另一个可能的问题是,您的web服务器(apatche等)被配置为添加该头或.htaccess文件中的一个选项指定了此项。

        3
  •  0
  •   Pedro Casado    6 年前

    可能最好的方法是 Service decoration ,但我现在更喜欢这种肮脏的方式。

    在我的例子中,我只是需要一个特定控制器的共享缓存头。

    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);
        }
    
    }