AppCache (Symfony2) で最初のレスポンスが非公開でも問題ありませんか? 質問する

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::ハンドル()方法)。

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

EsiResponseCache戦略レスポンスをキャッシュ不可能にするLast-ResponseまたはETagのいずれかを使用する場合(EsiResponseCacheStrategy::add()方法):

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

レスポンス::isValidateable()Last-Response または ETag ヘッダーが存在する場合は true を返します。

その結果、Cache-Control ヘッダーを上書きするEsiResponseCacheStrategy::更新()方法):

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

リクエストがどの環境で行われたかはもはや問題ではありませproddev

ベストアンサー1

私も同じ問題に直面しました。CDN に「パブリック」ヘッダーを提供する必要がありました。デフォルトでは、ゲートウェイ キャッシュが prod モードで有効になっている場合、プライベートで 200 OK が返され、nocache はヘッダーを検証する必要があります。

私はこのように問題を解決しました。

app.php では、ユーザーに応答を送信する前に ($respond->send)、キャッシュ制御ヘッダーを空白に上書きし、キャッシュ ヘッダーを public および max age(何らかの値) に設定しました。

//app.php からのコード スニペット

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

おすすめ記事