问题描述
我正在尝试设置缓存 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 目录中,但它们是空的
所有响应都具有以下标题:
解决方法
如果您的缓存总是未命中,则表明您正在访问请求中的 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 的缓存,这意味着例如每个角色都有自己的缓存。可以找到关于此的文档:
- https://docs.sulu.io/en/2.2/cookbook/user-context-caching.html
- https://foshttpcachebundle.readthedocs.io/en/latest/features/user-context.html
这主要用于您的应用在网站上具有安全性,并且只有特定角色可以查看特定路由时使用。