10

I try in annotation

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

or in controller

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

And still have Cache-Control: max-age=0, must-revalidate, private

App use sessions, user is login - I want - cache private, but nothing work - I always get this.

I've added FOS\HttpCacheBundle\FOSHttpCacheBundle()

(just add) Have hope to it override symfony cache and allow send cache private - but nothing change.

4

3 回答 3

16

这种行为是 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

于 2018-08-08T11:04:23.270 回答
3

可能最好的方法是使用服务装饰,但我现在更喜欢肮脏的方式。

就我而言,我只需要特定控制器的共享缓存标头。

Symfony 3.4.* 的解决方法:

创建一个优先级低于Symfony\Component\HttpKernel\EventListener\SessionListenerin的监听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);
    }

}
于 2018-10-17T03:09:12.090 回答
0

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

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

另一个可能的问题是您的网络服务器(Apatch 等)被配置为添加该标头或 .htaccess 文件中的一个选项指定这一点。

于 2018-06-15T10:28:32.743 回答