Это нормально, если первый ответ является приватным с AppCache (Symfony2)?

Я пытаюсь использовать кеширование http. В моем контроллере я устанавливаю ответ следующим образом:

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

режим dev

В среде защиты от вирусов первый ответ - 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

В заголовках ответов режима 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 для обновления кэшированного ответа (метод HttpCache:: handle()).

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

EsiResponseCacheStrategy превращает ответ в не кешируемый, если он использует либо Last-Response, либо ETag (EsiResponseCacheStrategy:: add()):

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

Response:: isValidateable() возвращает true, если присутствует заголовок Last-Response или ETag.

В результате перезаписывается заголовок Cache-Control (метод EsiResponseCacheStrategy:: 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.

Ответ 1

Я столкнулся с такой же проблемой. Я должен был предоставить "публичные" заголовки своему компьютеру. По умолчанию, когда кэширование шлюза включено в режиме prod, оно возвращает 200 OK с private, nocache должен проверять заголовки.

Я решил проблему таким образом.

В app.php, прежде чем отправить ответ пользователю ($ reply- > send), я перезаписал заголовок управления кешем пустым и установил заголовки кеша в общедоступный и максимальный возраст (некоторое значение).

//фрагмент кода из app.php

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

Ответ 2

Предполагается поведение, которое вы испытываете. Symfony2 Docs явно описывают ситуации, когда используются частные и общедоступные, по умолчанию являются закрытыми.