メニュー
Amazon CloudFront
開発者ガイド (API Version 2016-09-29)

クエリ文字列パラメータに基づいてキャッシュするように CloudFront を設定する

ウェブアプリケーションによっては、クエリ文字列を使用してオリジンに情報を送信します。クエリ文字列はウェブリクエストの一部で、? 文字の後に追加されます。この文字列には & 文字で区切られたパラメータを 1 つ以上含めることができます。次の例では、クエリ文字列には 2 つのパラメータ (color=redsize=large) が含まれています。

http://d111111abcdef8.cloudfront.net/images/image.jpg?color=red&size=large

ウェブディストリビューションの場合、CloudFront がクエリ文字列をオリジンに転送するかどうかを選択できます。転送する場合、すべてのパラメータまたは一部のパラメータのどちらに基づいてコンテンツをキャッシュするかを選択できます。

たとえば、ウェブサイトが 5 種類の言語で使用でき、ディレクトリ構造とファイル名はウェブサイトの5つのバージョンすべてで共通だとします。ユーザーがウェブサイトを表示すると、CloudFront に転送されるリクエストには、ユーザーが選択した言語に基づく言語によるクエリ文字列が含められます。また、クエリ文字列をオリジンに転送し、言語パラメータに基づいてキャッシュするよう CloudFront を設定できます。選択された言語に対応する特定バージョンのページを返すようウェブサーバーを設定した場合、CloudFront は、それぞれの言語によるクエリ文字列パラメータに基づく各言語のバージョンを個別にキャッシュします。

この例では、ウェブサイトのメインページが main.html で次の 5 つのリクエストが実行されると、CloudFront は、各言語のクエリ文字列パラメータをそれぞれの値として main.html を 5 回キャッシュします。

  • http://d111111abcdef8.cloudfront.net/main.html?language=de

  • http://d111111abcdef8.cloudfront.net/main.html?language=en

  • http://d111111abcdef8.cloudfront.net/main.html?language=es

  • http://d111111abcdef8.cloudfront.net/main.html?language=fr

  • http://d111111abcdef8.cloudfront.net/main.html?language=jp

次の点に注意してください。

  • RTMP ディストリビューションでは、クエリ文字列パラメータがオリジンに転送されるように CloudFront を構成することはできません。CloudFront がオリジンサーバーにリクエストを転送する前に、すべてのクエリ文字列パラメータが削除されます。

  • 一部の HTTP サーバーはクエリ文字列パラメータを処理しません。このため、パラメータ値に基づくオブジェクトの別バージョンを返しません。これらのオリジンについては、クエリ文字列パラメータをオリジンに返すよう CloudFront を設定している場合、オリジンがすべてのパラメータについて同一バージョンのオブジェクトを CloudFront に返したとしても、CloudFront は引き続きパラメータ値に基づくキャッシュを実行します。

  • クエリ文字列パラメータ間の区切り文字には & 文字を使用する必要があります。別の区切り文字を使用した場合、キャッシュは、キャッシュ条件として CloudFront で使用するパラメータと、それらがクエリ文字列に記述される順序の影響を受けます。次の例では、color パラメータだけに基づいてキャッシュするよう CloudFront を設定した場合にどのようになるかを示しています。

    • 次のリクエストでは、CloudFront は color パラメータの値に基づいてコンテンツをキャッシュしますが、この値を red;size=large と解釈します。

      http://d111111abcdef8.cloudfront.net/images/image.jpg?color=red;size=large

    • 次のリクエストでは、CloudFront はコンテンツをキャッシュしますが、実行されるキャッシュは、クエリ文字列パラメータに基づくものではありません。これは、color パラメータに基づいてキャッシュするよう CloudFront が設定されているものの、CloudFront は次の文字列に size パラメータ (値は large;color=red) だけしか含まれていないと解釈するためです。

      http://d111111abcdef8.cloudfront.net/images/image.jpg?size=large;color=red

次のいずれかを実行するよう CloudFront を設定できます。

  • クエリ文字列をオリジンにまったく転送しない。クエリ文字列を転送しない場合、CloudFront はクエリ文字列パラメータに基づくキャッシュを実行しません。

  • クエリ文字列をオリジンにキャッシュし、クエリ文字列内のすべてのパラメータに基づいてキャッシュする。

  • クエリ文字列をオリジンにキャッシュし、クエリ文字列内の指定したパラメータに基づいてキャッシュする。

詳細については、「キャッシュの最適化」を参照してください。

クエリ文字列の転送とキャッシュのためのコンソールおよび API の設定

クエリ文字列の転送とキャッシュを CloudFront コンソールで設定するには、「ウェブディストリビューションを作成または更新する場合に指定する値」の次のセクションを参照してください。

クエリ文字列の転送とキャッシュを CloudFront の API を使って設定するには、Amazon CloudFront API リファレンス の「DistributionConfig 複合型」および「DistributionConfigWithTags 複合型」を参照してください。

  • QueryString

  • QueryStringCacheKeys

キャッシュの最適化

クエリ文字列パラメータに基づいてキャッシュするよう CloudFront を設定する場合、ここで紹介する方法を使って CloudFront によるオリジンへの転送リクエストの数を削減することができます。これによりより多くのオブジェクトが CloudFront エッジロケーションから提供されるようになることで、オリジンサーバーの負荷が軽減され、レイテンシーが短縮されます。

オリジンが返すオブジェクトのバージョンが変わるパラメータだけに基づいてキャッシュする

CloudFront は、ウェブアプリケーションが CloudFront に転送する各クエリ文字列パラメータに対して、すべてのパラメータ値についてオリジンにリクエストを転送し、すべてのパラメータ値について異なるバージョンのオブジェクトをキャッシュします。これは、オリジンがパラメータの値に関係なく常に同じオブジェクトを返す場合も当てはまります。パラメータが複数ある場合、リクエスト数とオブジェクトの数は乗算されます。つまり、あるオブジェクトにパラメータが 2 つ含まれていて、それぞれのパラメータに異なる値が 3 つある場合、CloudFront がキャッシュするオブジェクトのバージョンは 6 種類になります。この場合、このセクションの別の推奨事項を参照することをお勧めします。

このため、オリジンが返すバージョンが変化するようなクエリ文字列パラメータだけに基づいてキャッシュするよう CloudFront を設定し、各パラメータに基づいてキャッシュするメリットを慎重に検討することをお勧めします。たとえば、ある通販ウェブサイトを運営していて、ジャケットの写真が色違いで 6 つあり、ジャケットのサイズは 10 種類だとします。また、ジャケットの写真は色違いの 6 色分だけが表示され、サイズ違いの分までは表示されていないものとします。この場合にキャッシュを最適化するには、サイズのパラメータではなく、色のパラメータだけに基づいてキャッシュするよう CloudFront を設定する必要があります。これにより、CloudFront がキャッシュからリクエストを処理できる可能性が高くなり、パフォーマンスが向上し、オリジンの負荷が低下します。

パラメータの順序を常に統一する

クエリ文字列では、パラメータの順序が重要になります。次の例は、パラメータの順序だけが異なる同じクエリ文字列です。この場合 CloudFront は、image.jpg に対する 2 つの異なるリクエストをオリジンに転送し、2 つの異なるバージョンのオブジェクトをキャッシュします。

  • http://d111111abcdef8.cloudfront.net/images/image.jpg?color=red&size=large

  • http://d111111abcdef8.cloudfront.net/images/image.jpg?size=large&color=red

このため、パラメータ名は、常に同じ順序 (アルファベット順など) にすることをお勧めします。

パラメータ名とパラメータ値の大文字と小文字を常に統一する

CloudFront は、クエリ文字列パラメータに基づいてキャッシュを実行する際に、パラメータ名とパラメータ値の大文字と小文字の違いを区別します。次の例は、パラメータ名とパラメータ値の大文字と小文字だけが異なる、同じクエリ文字列です。この場合 CloudFront は、image.jpg に対する 4 つの異なるリクエストをオリジンに転送し、4 つの異なるバージョンのオブジェクトをキャッシュします。

  • http://d111111abcdef8.cloudfront.net/images/image.jpg?color=red

  • http://d111111abcdef8.cloudfront.net/images/image.jpg?color=Red

  • http://d111111abcdef8.cloudfront.net/images/image.jpg?Color=red

  • http://d111111abcdef8.cloudfront.net/images/image.jpg?Color=Red

このため、パラメータ名とパラメータ値の大文字と小文字を統一する (すべて小文字など) ことをお勧めします。

署名付き URL と競合するパラメータ名を使わない

署名付き URL を使用してコンテンツへのアクセスを制限している場合 (信頼された署名者をディストリビューションに追加した場合)、CloudFront は以下のクエリ文字列パラメータを削除してから URL の残りをオリジンに転送します。

  • Expires

  • Key-Pair-Id

  • Policy

  • Signature

署名付き URL を使用しており、クエリ文字列をオリジンに転送するように CloudFront を構成する場合、独自のクエリ文字列パラメータに ExpiresKey-Pair-IdPolicy、または Signature という名前を付けることはできません。

クエリ文字列パラメータと CloudFront アクセスログ

ウェブディストリビューションと RTMP ディストリビューションでログ作成を有効にした場合、CloudFront は、クエリ文字列パラメータを含む完全な URL をログに記録します。ウェブディストリビューションでは、クエリ文字列がオリジンに転送されるように CloudFront を構成したかどうかに関係なく、そのようになります。CloudFront ログ作成の詳細については、「アクセスログ」を参照してください。