Я пытаюсь использовать 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
Стоит ли мне об этом беспокоиться? Это ожидаемое поведение?
Что будет, если я поставлю перед ним сервер Varnish или 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
среде.
источник
app.php
иapp_dev.php
то же? (игнорируя отладку и env)debug=>true
getOptions () в AppCache, чтобы получатьX-Symfony-Cache
заголовок?Ответы:
Я столкнулся с той же проблемой. Мне пришлось поставить «общедоступные» заголовки в свой cdn. По умолчанию, когда кэширование шлюза включено в режиме prod, он возвращает 200 OK с частным, nocache не должен проверять заголовки.
Так я решил проблему.
В app.php, прежде чем я отправлю ответ пользователю ($ response-> send), я перезаписал заголовок управления кешем пустым и установил заголовки кеша на общедоступный и максимальный возраст (некоторое значение).
// фрагмент кода из app.php
$response = $kernel->handle($request); $response->headers->set('Cache-Control', ''); $response->setPublic(); $response->setMaxAge(86400); $response->send();
источник
Поведение, которое вы испытываете, является преднамеренным. В документации Symfony2 явно описаны ситуации, когда используются частные и общедоступные , по умолчанию частные .
источник