Sulu 缓存总是未命中

问题描述

我正在尝试设置缓存 Sulu CMS 页面。在本地,我已将环境设置为 prod(尝试使用 dev,但在出现问题时切换到 prod),但打开了缓存调试。

config/packages/sulu_http_cache.yaml 看起来像这样:

sulu_http_cache:
    proxy_client:
        symfony:
            enabled: true
        debug:
            enabled: true

config/packages/prod/cache.yaml 看起来像这样

framework:
    cache:
        app: cache.adapter.filesystem
        system: cache.adapter.system

缓存目录存在于我的 /var 目录中,但它们是空的

所有响应都具有以下标题:

enter image description here

解决方法

如果您的缓存总是未命中,则表明您正在访问请求中的 session。 Symfony 中的以下内容将自动启动一个会话,例如:

  • 使用 csrf 令牌 (csrf_token)
  • 在路由上配置 unlazy 防火墙(检查您的 security_website.yaml
  • 访问 Flash 消息或其他类似内容 (app.flashes)
  • 访问会话本身 (app.session)
  • 访问当前用户 (app.user)

由于会话访问表明“响应”是特定于用户的,并且每个访问者都不同,symfony 会将响应设置为私有,因此它总是缓存未命中。

编辑您不再访问会话的代码,并且 Cache-Control 标头响应为“public”,HttpCache 组件将缓存此响应。

正如您所提到的,可以使用以下方法禁用 symfony 自动行为:

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

我个人会避免这种情况,因为它可能会缓存特定于安全的数据,或者例如在您不想要的 html 中写入缓存的用户名。

另一种方法是使用基于 UserContext 的缓存,这意味着例如每个角色都有自己的缓存。可以找到关于此的文档:

这主要用于您的应用在网站上具有安全性,并且只有特定角色可以查看特定路由时使用。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...