メニュー
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 ログ作成の詳細については、「アクセスログ」を参照してください。