Можно ли, если первый ответ будет частным с помощью 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

Стоит ли мне беспокоиться об этом? Это ожидаемое поведение?

Что произойдет, если я поставлю перед ним сервер Varnish или Akamai?

Я немного отладил и решил, что ответ является частным из-за последнего измененного заголовка. Ядро HttpCache использует EsiResponseCacheStrategy для обновления кэшированной ответ (HttpCache :: handle () метод).

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

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

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

Response :: isValidateable () возвращает true, если последний -Ответ или заголовок 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.


person Jakub Zalas    schedule 05.03.2012    source источник
comment
когда я отключаю $ kernel = new AppCache ($ kernel); мне это показано как публичное. но тогда он всегда будет отвечать с кодом 200 ... я использую в качестве прокси-сервера revery nginx.   -  person Michael    schedule 07.02.2013
comment
ваши app.php и app_dev.php одинаковы? (игнорируя отладку и env)   -  person Florian Klein    schedule 09.04.2013
comment
У меня больше нет доступа к этому проекту, поэтому я не могу это подтвердить. Я помню, что контроллеры были по умолчанию с включенным AppCache.   -  person Jakub Zalas    schedule 09.04.2013
comment
@Florian Я попытался воспроизвести проблему, и у меня немного другое поведение с последней версией Symfony (см. Обновление).   -  person Jakub Zalas    schedule 10.04.2013
comment
Какой у вас конкретный вопрос? Какая конкретная проблема у вас с этими заголовками? Что вы ожидали вместо этого? Какую практическую проблему это вызывает у вас? Что вы хотели сделать вместо этого? Считаете ли вы, что конкретная спецификация (например, RFC) нарушена? Если да, то какой именно и в какой его части? Заголовки сами по себе соответствуют HTTP, поэтому ваш вопрос действительно широкий.   -  person hakre    schedule 18.07.2013
comment
Поведение изменилось с тех пор, как я впервые задал вопрос (изначально оно было несовместимым между средами). Я предполагаю, что теперь это вопрос интерпретации RFC и допустимо ли текущее поведение в соответствии с ним или нет. Поскольку первый ответ с заголовком Last-Modified является частным, я могу ответить себе, что он недействителен в соответствии со спецификацией, поскольку он описывает его как: response_is_fresh = (freshness_lifetime ›current_age).   -  person Jakub Zalas    schedule 22.07.2013
comment
Я дважды проверю это ...   -  person Jakub Zalas    schedule 22.07.2013
comment
Может ли это быть из-за небольшой разницы во времени между клиентом и сервером?   -  person Marek    schedule 15.11.2013
comment
Не могли бы вы установить debug=>true в getOptions () в AppCache, чтобы получить X-Symfony-Cache заголовок?   -  person denkiryokuhatsuden    schedule 11.12.2013
comment
@Marek с временем последнего изменения на клиенте не имеет значения, поскольку он должен отправить то же значение обратно (через If-Modified-Since).   -  person Jakub Zalas    schedule 29.01.2014


Ответы (2)


Я столкнулся с той же проблемой. Мне пришлось поставить «общедоступные» заголовки в свой 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();        
person srikanthsatturi    schedule 09.02.2014
comment
Вы получали частные ответы, несмотря на то, что они были открыты в контроллере? - person Jakub Zalas; 09.02.2014
comment
Да, если я включу кеширование шлюза и запустил его в режиме prod. Мне нужно вышеуказанное решение для статического содержимого. - person srikanthsatturi; 09.02.2014

Поведение, которое вы испытываете, является преднамеренным. Symfony2 Docs явно описывают ситуации, когда закрытый и < em> public, по умолчанию private.

person Udan    schedule 22.10.2013
comment
Это не мой случай, извините. - person Jakub Zalas; 24.10.2013