0

ホームページのコンテンツを構築するために使用されるすべてのデータを取得することを避けるために、プライベート/パブリック キャッシュを使用しようとしていました。これは静かな静的コンテンツです。

私はそのようにしようとします。

    $response->setMaxAge(600);
    // mark the response as either public or private
    $response->setPublic();
    $response->setPrivate();

    // set the private or shared max age
    $response->setMaxAge(2000);
    $response->setSharedMaxAge(2000);
    $response->setETag(md5($response->getContent()));
    $response->isNotModified($this->getRequest());
    // set a custom Cache-Control directive
    $response->headers->addCacheControlDirective('must-revalidate', true);

しかし、言語と通貨の選択のように、非常に動的に変化する小さな情報がいくつかあります。

ユーザーが言語または通貨を変更することを決定した場合、コンテンツを変更するにはどうすればよいですか?

URL が home.site/fr または home.site/en と異なるため、現在は言語で機能しています。

ただし、通貨の情報は URL に含まれておらず、認証済みかどうかなどのその他の情報も URL に含まれていません。

では、どのように Http キャッシュを使用し、物事を実際のユーザー アクションに適合させるのでしょうか?

ご協力いただきありがとうございます。

ヨニ

4

1 に答える 1

4

HTTP キャッシュを使用する場合、アプリケーションを全体として考える必要があります。

リバース プロキシに応じて、デフォルトの戦略は URI に基づいてページをキャッシュすることです。ETag は、バックエンドから実際のデータをフェッチしないように条件付きリクエストを作成するために使用されますが、キャッシュ戦略の動作は変更されません。

したがって、現在の設定を使用すると、定義された 2000 秒以内にユーザーがアクセスするたびに、ユーザーがexample.net/fr選択した通貨に関係なく、バックエンドから取得された最初のキャッシュされたコンテンツが取得されます。

パフォーマンスを最適化したい場合は、あまり一般的でない情報を削除するために削減する必要があります。

あなたの場合、おそらくコンテンツの少なくとも 2 つの表現をキャッシュする必要があります。

  1. フランス + ユーロ
  2. EN + ユーロ

など。

なんで?可能なすべての表現をキャッシュしたくないか、キャッシュが役に立たなくなるためです。

キャッシュ戦略を効率的にするには、最大数の人々のデータをキャッシュできる必要があります。そのため、「ようこそ {username}」のようなブロックがある場合、その表現をキャッシュする必要がある可能性が高いため、失敗します。すべてのユーザーのためのあなたのコンテンツ、それは間違っています。

ある種の「ようこそ {username}」ブロックを保持する最良の方法は、ESI を使用することです。これにより、レイアウトを複数のブロックに分割し、それぞれ異なるキャッシュ戦略を使用できます (またはキャッシュをまったく使用しません)。

あなたの場合の問題は、通貨がある種のクッキーに保存されているに違いないということです。デフォルトでは、ほとんどのリバース プロキシ (varnish など) は、Cookie を使用して応答をキャッシュしません。これは、主要なセキュリティ ホールになる可能性があるためです。

したがって、基本的に 2 つのソリューションがあり、カスタム戦略を定義します。Varnish を使用するか、HTTP 機能 (カスタム ヘッダー + Vary) を使用する場合は非常に簡単です。

于 2013-10-14T18:38:05.907 に答える