首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Symfony 3.4 http缓存,总是缓存-控制: max-age=0,必须重新验证,私有

Symfony 3.4 http缓存,总是缓存-控制: max-age=0,必须重新验证,私有
EN

Stack Overflow用户
提问于 2018-06-14 15:33:23
回答 4查看 5.5K关注 0票数 10

我试着在注释中

代码语言:javascript
运行
复制
 * @Cache(expires="+10 hours", public=false) 

或在控制器内

代码语言:javascript
运行
复制
$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缓存并允许发送缓存私有--但是没有任何改变。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-08 11:04:23

这种行为是从Symfony 3.4和4.0开始的。如果用户会话已经初始化,它将始终设置标题,如您的问题中所述。

介绍在Symfony 4.1中,您可以重写此行为。但是,由于这是一个新特性,因此不会支持Symfony 3.4。

代码语言:javascript
运行
复制
$response->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER, 'true');

您可以在Symfony文档中阅读到这方面的内容:HTTP缓存和用户会话

票数 18
EN

Stack Overflow用户

发布于 2018-10-17 03:09:12

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

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

为Symfony 3.4工作*

Symfony\Component\HttpKernel\EventListener\SessionListener中创建一个优先级低于services.yml的侦听器(不知道是否推荐这样做):

代码语言:javascript
运行
复制
AppBundle\Listener\ResponseListener:
    tags:
        - { name: kernel.event_listener, event: kernel.response, priority: -1001 }

然后在AppBundle\Listener\ResponseListener

代码语言:javascript
运行
复制
<?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);
    }

}
票数 3
EN

Stack Overflow用户

发布于 2018-06-15 10:28:32

您使用的是像Symfony one这样的反向代理吗?Cache.html#symfony-反向代理

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50861157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档