クエリ文字列パラメータに基づいてコンテンツをキャッシュする
ウェブアプリケーションによっては、クエリ文字列を使用してオリジンに情報を送信します。クエリ文字列はウェブリクエストの一部で、?
文字の後に追加されます。この文字列には &
文字で区切られたパラメータを 1 つ以上含めることができます。次の例では、クエリ文字列には 2 つのパラメータ (color=red
と size=large
) が含まれています。
https://d111111abcdef8.cloudfront.net/images/image.jpg?
color=red&size=large
ディストリビューションでは、CloudFront がクエリ文字列をオリジンに転送するかどうかと、すべてのパラメータまたは一部のパラメータのどちらに基づいてコンテンツをキャッシュするかを選択できます。これが役立つ場合があるのはなぜですか。次の の例を考えます。
たとえば、ウェブサイトが 5 種類の言語で使用でき、ディレクトリ構造とファイル名はウェブサイトの 5 つのバージョンすべてで共通だとします。ユーザーがウェブサイトを表示すると、CloudFront に転送されるリクエストには、ユーザーが選択した言語に基づく言語によるクエリ文字列が含められます。また、クエリ文字列をオリジンに転送し、言語パラメータに基づいてキャッシュするよう CloudFront を設定できます。選択された言語に対応する特定バージョンのページを返すようウェブサーバーを設定した場合、CloudFront は、それぞれの言語によるクエリ文字列パラメータに基づく各言語のバージョンを個別にキャッシュします。
この例では、ウェブサイトのメインページが main.html
であり、以下の 5 つのリクエストが実行されると、CloudFront は、各言語のクエリ文字列パラメータをそれぞれの値として main.html
を 5 回キャッシュします。
-
https://d111111abcdef8.cloudfront.net/main.html?
language=de
-
https://d111111abcdef8.cloudfront.net/main.html?
language=en
-
https://d111111abcdef8.cloudfront.net/main.html?
language=es
-
https://d111111abcdef8.cloudfront.net/main.html?
language=fr
-
https://d111111abcdef8.cloudfront.net/main.html?
language=jp
次の点に注意してください。
-
一部の HTTP サーバーはクエリ文字列パラメータを処理しません。このため、パラメータ値に基づくオブジェクトの別バージョンを返しません。これらのオリジンに対して、クエリ文字列パラメータをオリジンに転送するように CloudFront を設定している場合、オリジンがパラメータ値ごとに同じバージョンのオブジェクトを CloudFront に返したとしても、CloudFront は引き続きパラメータ値に基づくキャッシュを実行します。
-
上記の例で説明したようにクエリ文字列パラメータを言語で使用するには、クエリ文字列パラメータ間の区切り文字として
&
文字を使用する必要があります。別の区切り文字を使用した場合、キャッシュは、キャッシュ条件として CloudFront で指定するパラメータと、それらのパラメータがクエリ文字列に記述される順序の影響を受けて、予期しない結果が生じる場合があります。以下の例では、
color
パラメータだけに基づいてキャッシュするよう、異なる区切り記号を使用して CloudFront を設定した場合にどのようになるかを示しています。-
以下のリクエストでは、CloudFront は
color
パラメータの値に基づいてコンテンツをキャッシュしますが、この値をred;size=large
と解釈します。https://d111111abcdef8.cloudfront.net/images/image.jpg?
color=red;size=large
-
以下のリクエストでは、CloudFront はコンテンツをキャッシュしますが、実行されるキャッシュは、クエリ文字列パラメータに基づくものではありません。これは、
color
パラメータに基づいてキャッシュするよう CloudFront が設定されているが、CloudFront は以下の文字列にsize
パラメータ (値はlarge;color=red
) のみが含まれていると解釈するためです。https://d111111abcdef8.cloudfront.net/images/image.jpg?
size=large;color=red
-
次のいずれかを実行するよう CloudFront を設定できます。
-
クエリ文字列をオリジンにまったく転送しない。クエリ文字列を転送しない場合、CloudFront はクエリ文字列パラメータに基づくキャッシュを実行しません。
-
クエリ文字列をオリジンに転送し、クエリ文字列内のすべてのパラメータに基づいてキャッシュする。
-
クエリ文字列をオリジンに転送し、クエリ文字列内の指定したパラメータに基づいてキャッシュする。
詳細については、「キャッシュを最適化する」を参照してください。
クエリ文字列の転送とキャッシュのためのコンソールおよび API の設定
クエリ文字列の転送とキャッシュを CloudFront コンソールで設定するには、「ディストリビューション設定リファレンス」の以下のセクションを参照してください。
CloudFront API でクエリ文字列の転送とキャッシュを設定するには、「Amazon CloudFront API リファレンス」の「CachePolicy」と「OriginRequestPolicy」を参照してください。
キャッシュを最適化する
クエリ文字列パラメータに基づいてキャッシュするように CloudFront を設定する場合、以下の手順を実行して、CloudFront がオリジンに転送するリクエストの数を減らすことができます。CloudFront エッジロケーションがオブジェクトを提供する場合、オリジンサーバーの負荷が軽減され、レイテンシーが減少します。これは、オブジェクトがユーザーに近い場所から提供されるためです。
- オリジンが返すオブジェクトのバージョンが変わるパラメータだけに基づいてキャッシュする
-
CloudFront は、ウェブアプリケーションが CloudFront に転送する各クエリ文字列パラメータに対して、すべてのパラメータ値についてオリジンにリクエストを転送し、すべてのパラメータ値について異なるバージョンのオブジェクトをキャッシュします。これは、オリジンがパラメータの値に関係なく常に同じオブジェクトを返す場合も当てはまります。パラメータが複数ある場合、リクエスト数とオブジェクトの数は乗算されます。
このため、オリジンが返すバージョンが変化するようなクエリ文字列パラメータだけに基づいてキャッシュするよう CloudFront を設定し、各パラメータに基づいてキャッシュするメリットを慎重に検討することをお勧めします。たとえば、ある通販ウェブサイトを運営していて、ジャケットの写真が色違いで 6 つあり、ジャケットのサイズは 10 種類だとします。また、ジャケットの写真は色違いだけが表示され、サイズ違いの分までは表示されていないものとします。この場合にキャッシュを最適化するには、サイズのパラメータではなく、色のパラメータだけに基づいてキャッシュするよう CloudFront を設定する必要があります。これにより、CloudFront がキャッシュからリクエストを処理できる可能性が高くなり、パフォーマンスが向上し、オリジンの負荷が低下します。
- パラメータの順序を常に統一する
-
クエリ文字列では、パラメータの順序が重要になります。次の例は、パラメータの順序だけが異なる同じクエリ文字列です。この場合 CloudFront は、image.jpg に対する 2 つの異なるリクエストをオリジンに転送し、2 つの異なるバージョンのオブジェクトをキャッシュします。
-
https://d111111abcdef8.cloudfront.net/images/image.jpg?
color=red&size=large
-
https://d111111abcdef8.cloudfront.net/images/image.jpg?
size=large&color=red
このため、パラメータ名は、常に同じ順序 (アルファベット順など) にすることをお勧めします。
-
- パラメータ名とパラメータ値の大文字と小文字を常に統一する
-
CloudFront は、クエリ文字列パラメータに基づいてキャッシュを実行する際に、パラメータ名とパラメータ値の大文字と小文字の違いを区別します。次の例は、パラメータ名とパラメータ値の大文字と小文字だけが異なる、同じクエリ文字列です。この場合 CloudFront は、image.jpg に対する 4 つの異なるリクエストをオリジンに転送し、4 つの異なるバージョンのオブジェクトをキャッシュします。
-
https://d111111abcdef8.cloudfront.net/images/image.jpg?
color=red
-
https://d111111abcdef8.cloudfront.net/images/image.jpg?
color=Red
-
https://d111111abcdef8.cloudfront.net/images/image.jpg?
Color=red
-
https://d111111abcdef8.cloudfront.net/images/image.jpg?
Color=Red
このため、パラメータ名とパラメータ値の大文字と小文字を統一する (すべて小文字など) ことをお勧めします。
-
- 署名付き URL と競合するパラメータ名を使わない
-
署名付き URL を使用してコンテンツへのアクセスを制限している場合 (信頼された署名者をディストリビューションに追加した場合)、CloudFront は以下のクエリ文字列パラメータを削除してから URL の残りをオリジンに転送します。
-
Expires
-
Key-Pair-Id
-
Policy
-
Signature
署名付き URL を使用しており、クエリ文字列をオリジンに転送するように CloudFront を設定する場合、独自のクエリ文字列パラメータに
Expires
、Key-Pair-Id
、Policy
、またはSignature
という名前を付けることはできません。 -
クエリ文字列パラメータと CloudFront 標準ログ (アクセスログ)
ログ作成を有効にした場合、CloudFront は、クエリ文字列パラメータを含む完全な URL をログに記録します。クエリ文字列がオリジンに転送されるように CloudFront を設定したかどうかに関係なく、そのような動作になります。CloudFront ログ記録の詳細については、「標準ログ (アクセスログ) を設定および使用する」を参照してください。