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
これは基本的に私が期待していることです。
製品モード
製品モードでは、応答ヘッダーが異なります。 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() は、Last-ResponseまたはETagヘッダーが存在する場合にtrueを返します。
結果は 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
2番目の応答は期待されています:
Cache-Control:max-age=120, public, s-maxage=120
If-Modified-Since
ヘッダーを送信しない場合、すべてのリクエストがmust-revalidate, no-cache, private
を返します。
リクエストがprod
またはdev
環境のどちらで行われたかは関係ありません。
私は同じ問題に直面しました。 「公開」ヘッダーをcdnに指定する必要がありました。ゲートウェイキャッシングがprodモードで有効になっている場合、デフォルトではプライベートで200 OKを返し、nocacheはヘッダーを検証する必要があります。
私はこの方法で問題を解決しました。
App.phpで、ユーザーに応答を送信する前に($ respond-> send)、キャッシュコントロールヘッダーを空白に上書きし、キャッシュヘッダーをpublicおよびmax age(some value)に設定しました。
// app.phpからのコードスニペット
$response = $kernel->handle($request);
$response->headers->set('Cache-Control', '');
$response->setPublic();
$response->setMaxAge(86400);
$response->send();