如果第一个响应对 AppCache (Symfony2)是私有的,这样好吗?

我尝试使用 http 缓存。在我的控制器中,我设置了如下响应:

$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);

开发模式

在开发环境中,第一个响应是带有以下标题的200:

cache-control:max-age=120, public, s-maxage=120
last-modified:Wed, 29 Feb 2012 19:00:00 GMT

在接下来的2分钟内,每个响应都是304,标题如下:

cache-control:max-age=120, public, s-maxage=120

这基本上就是我所期望的。

刺激模式

在 prod 模式下响应头是不同的。请注意,在 app.php 中,我将内核封装在 AppCache 中。

第一个答复是200,标题如下:

cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT

所以这是一个私有的无缓存响应。

每个下一个请求都和我期望的差不多; 一个304请求,标题如下:

cache-control:max-age=120, public, s-maxage=120

我应该担心吗? 这是预料之中的行为吗

如果我把清漆或 Akamai 服务器放在它的前面会发生什么?

我做了一点调试,我认为这个响应是私有的,因为上次修改了头部。HttpCache 内核 使用 EsiResponseCacheStrategy更新缓存的响应(Handle ()方法)。

if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
}

如果使用 Last-Response 或 ETag (EsiResponseCacheStrategy: : add ()方法) ,则使用 EsiResponseCacheStrategy 将响应转换为不可缓存的:

if ($response->isValidateable()) {
$this->cacheable = false;
} else {
// ...
}

Response: : isValidateable () 如果存在 Last-Response 或 ETag 头,则返回 true。

它的结果是 覆盖 Cache-Control 标头(策略: : update ()方法) :

if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');


return;
}

我在 Symfony2用户组上问了这个问题,但是到目前为止还没有得到答案: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion

更新。

由于我不再有权限访问原始代码,我尝试 用最新的 Symfony 标准版本重现这个场景

响应头现在更加一致了,但似乎仍然是错误的。

一旦我在响应上设置了 Last-Modified头,浏览器做出的第一个响应就有:

Cache-Control:must-revalidate, no-cache, private

第二种回应是预期的:

Cache-Control:max-age=120, public, s-maxage=120

如果我避免发送 If-Modified-Since头,每个请求返回 must-revalidate, no-cache, private

请求是在 prod还是 dev环境中发出的已经不重要了。

6384 次浏览

您所经历的行为是预期的。 Symfony2文档显式地描述了使用 二等兵公众人士的情况,默认情况是 二等兵

我也遇到过同样的问题。我必须提供我的 cdn 的“公共”头。默认情况下,当在 prod 模式下启用网关缓存时,它返回200OK 和 private,nocache 必须验证头。

我就是这样解决问题的。

在 app.php 中,在向用户发送响应($response-> send)之前,我将缓存控制头重写为空,并将缓存头设置为 public 和 max age (某个值)。

//来自 app.php 的代码片段

    $response = $kernel->handle($request);
$response->headers->set('Cache-Control', '');
$response->setPublic();
$response->setMaxAge(86400);
$response->send();