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
環境で行われたかは関係ありません。
app.php
とapp_dev.php
同じですか?(debugとenvは無視)
debug=>true
を取得できるように、AppCacheのgetOptions()に設定しますX-Symfony-Cache
か?