

# カスタムオリジンの場合のリクエストおよびレスポンスの動作
<a name="RequestAndResponseBehaviorCustomOrigin"></a>

カスタムオリジンの使用時に CloudFront がリクエストとレスポンスを処理する方法については、以下のセクションを参照してください。

**Topics**
+ [CloudFront がリクエストを処理してカスタムオリジンに転送する方法](#RequestBehaviorCustomOrigin)
+ [CloudFront がカスタムオリジンからのレスポンスを処理する方法](#ResponseBehaviorCustomOrigin)

## CloudFront がリクエストを処理してカスタムオリジンに転送する方法
<a name="RequestBehaviorCustomOrigin"></a>

CloudFront がビューワーのリクエストを処理してカスタムオリジンに転送する方法について説明します。

**Contents**
+ [認証](#RequestCustomClientAuth)
+ [キャッシュ期間および最小 TTL](#RequestCustomCaching)
+ [クライアント IP アドレス](#RequestCustomIPAddresses)
+ [クライアント側の SSL 認証](#RequestCustomClientSideSslAuth)
+ [圧縮](#RequestCustomCompression)
+ [条件付きリクエスト](#RequestCustomConditionalGETs)
+ [Cookie](#RequestCustomCookies)
+ [Cross-Origin Resource Sharing (CORS)](#request-custom-cors)
+ [暗号化](#RequestCustomEncryption)
+ [本文が含まれている GET リクエスト](#RequestCustom-get-body)
+ [HTTP メソッド](#RequestCustomHTTPMethods)
+ [HTTP リクエストヘッダーと CloudFront の動作 (カスタムオリジンおよび Amazon S3 オリジン)](#request-custom-headers-behavior)
+ [HTTP バージョン](#RequestCustomHTTPVersion)
+ [リクエストの最大長と URL の最大長](#RequestCustomMaxRequestStringLength)
+ [OCSP stapling](#request-custom-ocsp-stapling)
+ [持続的接続](#request-custom-persistent-connections)
+ [プロトコル](#RequestCustomProtocols)
+ [クエリ文字列](#RequestCustomQueryStrings)
+ [オリジン接続のタイムアウトと試行](#custom-origin-timeout-attempts)
+ [オリジン応答タイムアウト](#request-custom-request-timeout)
+ [同一オブジェクトへの同時リクエスト (リクエストを折りたたむ)](#request-custom-traffic-spikes)
+ [`User-Agent` ヘッダー](#request-custom-user-agent-header)

### 認証
<a name="RequestCustomClientAuth"></a>

`Authorization` ヘッダーをオリジンに転送すると、次のタイプのリクエストに対してクライアント認証を要求するようにオリジンサーバーを設定できます。
+ `DELETE`
+ `GET`
+ `HEAD`
+ `PATCH`
+ `PUT`
+ `POST`

`OPTIONS` リクエストの場合、次の CloudFront 設定を使用した場合のみ、クライアント認証を設定できます。**
+ CloudFront は、`Authorization` ヘッダーをオリジンに転送するように設定されます。
+ CloudFront は、`OPTIONS` リクエストへの応答をキャッシュしないように設定されます。**

詳細については、「[`Authorization` ヘッダーを転送するように CloudFront を設定する](add-origin-custom-headers.md#add-origin-custom-headers-forward-authorization)」を参照してください。

HTTP または HTTPS を使用して、リクエストをオリジンサーバーに転送できます。詳細については、「[CloudFront で HTTPS を使用する](using-https.md)」を参照してください。

### キャッシュ期間および最小 TTL
<a name="RequestCustomCaching"></a>

CloudFront が別のリクエストをオリジンに転送するまでにオブジェクトを CloudFront キャッシュに保持する時間を制御するには、次の手順を実行します。
+ `Cache-Control` または `Expires` ヘッダーフィールドを各オブジェクトに追加するようにオリジンを構成します。
+ CloudFront キャッシュ動作で、最小 TTL の値を指定します。
+ デフォルト値の 24 時間を使用します。

詳細については、「[コンテンツをキャッシュに保持する期間 (有効期限) を管理する](Expiration.md)」を参照してください。

### クライアント IP アドレス
<a name="RequestCustomIPAddresses"></a>

ビューワーがリクエストを CloudFront に送信し、`X-Forwarded-For` リクエストヘッダーを含めない場合、CloudFront は TCP 接続からビューワーの IP アドレスを取得して、IP アドレスが含まれた `X-Forwarded-For` ヘッダーを追加し、リクエストをオリジンに転送します。たとえば、CloudFront が TCP 接続から IP アドレス `192.0.2.2` を取得する場合、以下のヘッダーをオリジンに転送します。

`X-Forwarded-For: 192.0.2.2`

ビューワーがリクエストを CloudFront に転送して `X-Forwarded-For` リクエストヘッダーを含める場合、CloudFront はビューワーの IP アドレスを TCP 接続から取得してそれを `X-Forwarded-For` ヘッダーの末尾に追加し、リクエストをオリジンに転送します。たとえば、ビューワーのリクエストに `X-Forwarded-For: 192.0.2.4,192.0.2.3` が含まれ、CloudFront が TCP 接続から IP アドレス `192.0.2.2` を取得する場合、以下のヘッダーをオリジンに転送します。

`X-Forwarded-For: 192.0.2.4,192.0.2.3,192.0.2.2`

ロードバランサー (Elastic Load Balancing を含む)、ウェブアプリケーションファイアウォール、リバースプロキシ、侵入防御システム、API Gateway などの一部のアプリケーションでは、リクエストを転送した CloudFront エッジサーバーの IP アドレスが `X-Forwarded-For` ヘッダーの末尾に付加されます。たとえば、CloudFront から ELB に転送するリクエストに `X-Forwarded-For: 192.0.2.2` が含まれていて、CloudFront エッジサーバーの IP アドレスが 192.0.2.199 である場合、EC2 インスタンスで受け取るリクエストのヘッダーは次のようになります。

`X-Forwarded-For: 192.0.2.2,192.0.2.199`

**注記**  
`X-Forwarded-For` ヘッダーには、IPv4 アドレス (192.0.2.44 など) および IPv6 アドレス (2001:0db8:85a3::8a2e:0370:7334 など) が含まれます。  
また、`X-Forwarded-For` ヘッダーは現在のサーバー (CloudFront) へのパス上のすべてのノードによって変更される可能性があることにも注意してください。詳細については、[RFC 7239](https://datatracker.ietf.org/doc/html/rfc7239) のセクション 8.1 を参照してください。CloudFront エッジコンピューティング関数を使用してヘッダーを変更することもできます。

### クライアント側の SSL 認証
<a name="RequestCustomClientSideSslAuth"></a>

CloudFront は、クライアントとサーバーの両方が証明書を使用して相互に認証する相互 TLS (mTLS) 認証をサポートしています。mTLS を設定すると、CloudFront は TLS ハンドシェイク中にクライアント証明書を検証し、オプションで CloudFront Functions を実行してカスタム検証ロジックを実装できます。

mTLS が設定されていないときにクライアント側の証明書をリクエストするオリジンの場合、CloudFront はリクエストを削除します。

mTLS の設定に関する詳細は、「[CloudFront Connection Function を関連付ける](connection-functions.md)」を参照してください。

CloudFront はクライアント側の SSL 証明書を使用したクライアント認証をサポートしていません。オリジンがクライアント側証明書をリクエストした場合、CloudFront はリクエストを削除します。

### 圧縮
<a name="RequestCustomCompression"></a>

詳しくは、「[圧縮ファイルを供給する](ServingCompressedFiles.md)」を参照してください。

### 条件付きリクエスト
<a name="RequestCustomConditionalGETs"></a>

CloudFront は、エッジキャッシュで有効期限切れになっているオブジェクトに対するリクエストを受け取ると、リクエストをオリジンに転送し、オブジェクトの最新バージョンを取得するか、CloudFront エッジキャッシュに最新バージョンがすでに存在することをオリジンに確認します。通常、オリジンはオブジェクトを CloudFront に最後に送信するときに、`ETag` 値または `LastModified` 値、あるいはその両方の値をレスポンスに含めます。CloudFront は、CloudFront がオリジンに転送する新しいリクエストには、次のどちらかまたは両方を追加します。
+ オブジェクトの有効期限切れバージョンの `If-Match` 値が含まれる `If-None-Match` または `ETag` ヘッダー。
+ オブジェクトの有効期限切れバージョンの `If-Modified-Since` 値が含まれる `LastModified` ヘッダー。

オリジンは、この情報を使用して、オブジェクトが更新されているかどうかを判別します。つまり、オブジェクト全体を CloudFront に返すか、または HTTP 304 ステータスコード (変更なし) のみを返すかを判別します。

**注記**  
`If-Modified-Since` と `If-None-Match` の条件付きリクエストは、CloudFront が Cookie (すべてまたはサブセット) を転送するように設定されている場合はサポートされません。  
詳細については、「[Cookie に基づいてコンテンツをキャッシュする](Cookies.md)」を参照してください。

### Cookie
<a name="RequestCustomCookies"></a>

Cookie をオリジンに転送するように CloudFront を構成できます。詳細については、「[Cookie に基づいてコンテンツをキャッシュする](Cookies.md)」を参照してください。

### Cross-Origin Resource Sharing (CORS)
<a name="request-custom-cors"></a>

CloudFront で Cross-Origin Resource Sharing 設定を適用する場合は、`Origin` ヘッダーをオリジンに転送するように CloudFront を設定します。詳しくは、「[リクエストヘッダーに基づいてコンテンツをキャッシュする](header-caching.md)」を参照してください。

### 暗号化
<a name="RequestCustomEncryption"></a>

HTTPS を使用してリクエストを CloudFront に送信するようにビューワーに要求し、ビューワーが使用しているプロトコルを使用してカスタムオリジンにリクエストを転送するように CloudFront に要求することもできます。詳細については、次のディストリビューション設定を参照してください。
+ [ビューワープロトコルポリシー](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy)
+ [プロトコル (カスタムオリジンのみ)](DownloadDistValuesOrigin.md#DownloadDistValuesOriginProtocolPolicy)

CloudFront は、SSLv3、TLSv1.0、TLSv1.1、TLSv1.2 および TLSv1.3 プロトコルを使用して、HTTPS リクエストをオリジンサーバーに転送します。カスタムオリジンでは、オリジンと通信する際に CloudFront が使用する SSL プロトコルを選択できます。
+ CloudFront コンソールを使用する場合は、[**オリジン SSL プロトコル**] チェックボックスを使用するプロトコルを選択します。詳細については、「[ディストリビューションを作成する](distribution-web-creating-console.md)」を参照してください。
+ CloudFront API を使用する場合は、`OriginSslProtocols` 要素を使用してプロトコルを指定します。詳細については、*Amazon CloudFront API リファレンス*の「[OriginSslProtocols](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_OriginSslProtocols.html)」および「[DistributionConfig](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_DistributionConfig.html)」を参照してください。

オリジンが Amazon S3 バケットの場合、CloudFront はデフォルトで TLSv1.3 を使用します。

**重要**  
SSL と TLS のその他のバージョンはサポートされていません。

CloudFront での HTTPS の使用の詳細については、「[CloudFront で HTTPS を使用する](using-https.md)」を参照してください。ビューワーと CloudFront との間、および CloudFront とオリジンとの間の HTTPS 通信で CloudFront がサポートする暗号のリストについては、[ビューワーと CloudFront との間でサポートされているプロトコルと暗号](secure-connections-supported-viewer-protocols-ciphers.md) を参照してください。

### 本文が含まれている GET リクエスト
<a name="RequestCustom-get-body"></a>

ビューワー `GET` のリクエストの本文が含まれている場合、CloudFront はビューワーに HTTP ステータスコード 403 (禁止) を返します。

### HTTP メソッド
<a name="RequestCustomHTTPMethods"></a>

サポートするすべての HTTP メソッドを処理するよう CloudFront を構成すると、CloudFront はビューワーからの以下のリクエストを受け入れてカスタムオリジンに転送します。
+ `DELETE`
+ `GET`
+ `HEAD`
+ `OPTIONS`
+ `PATCH`
+ `POST`
+ `PUT`

CloudFront は、`GET` リクエストと `HEAD` リクエストへの応答を常にキャッシュします。`OPTIONS` リクエストへの応答をキャッシュするように CloudFront を設定することもできます。CloudFront はその他のメソッドを使用するリクエストへのレスポンスをキャッシュしません。

カスタムオリジンが上記のメソッドを処理するかどうかを構成する方法の詳細については、オリジンのドキュメントを参照してください。

**重要**  
CloudFront がサポートするすべての HTTP メソッドを受け入れてオリジンに転送するように CloudFront を構成する場合、オリジンサーバーがすべてのメソッドを処理するように構成します。たとえば、`POST` を使用するために、上記のメソッドを受け入れて転送するように CloudFront を構成する場合は、`DELETE` リクエストを適切に処理するようオリジンサーバーを構成して、削除すべきでないリソースをビューワーが削除できないようにする必要があります。詳細については、HTTP サーバーのドキュメントを参照してください。

### HTTP リクエストヘッダーと CloudFront の動作 (カスタムオリジンおよび Amazon S3 オリジン)
<a name="request-custom-headers-behavior"></a>

次の表は、カスタムオリジンと Amazon S3 オリジンの両方に転送できる HTTP リクエストヘッダーを示しています (例外も注記されています)。この表には、各ヘッダーについて以下に関する情報も含まれています。
+ ヘッダーをオリジンに転送するように CloudFront を設定していない場合の CloudFront の動作。この場合、CloudFront はヘッダー値に基づいてオブジェクトをキャッシュします。
+ そのヘッダーの値に基づいてオブジェクトをキャッシュするように CloudFront を設定できるかどうか。

  `Date` および `User-Agent` ヘッダーの値に基づいてオブジェクトをキャッシュするように CloudFront を設定できますが、これはお勧めできません。これらのヘッダーには可能な値が多数あり、その値に基づいてキャッシュすると、CloudFront がオリジンに転送するリクエストの数が大幅に増加します。

ヘッダー値に基づくキャッシュの詳細については、「[リクエストヘッダーに基づいてコンテンツをキャッシュする](header-caching.md)」を参照してください。


| ヘッダー | ヘッダー値に基づいてキャッシュするように CloudFront を設定しない場合の動作 | ヘッダー値に基づくキャッシュがサポートされている | 
| --- | --- | --- | 
|  他の定義されたヘッダー  |  **レガシーキャッシュ設定** – CloudFront はヘッダーをオリジンに転送します。  |  はい  | 
|  `Accept`  |  CloudFront はヘッダーを削除します。  |  はい  | 
|  `Accept-Charset`  |  CloudFront はヘッダーを削除します。  |  はい  | 
|  `Accept-Encoding`  |  値に `gzip` または `br` が含まれている場合、CloudFront は正規化された `Accept-Encoding` ヘッダーをオリジンに転送します。 詳細については、「[圧縮のサポート](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)」および「[圧縮ファイルを供給する](ServingCompressedFiles.md)」を参照してください。  |  はい  | 
|  `Accept-Language`  |  CloudFront はヘッダーを削除します。  |  はい  | 
|  `Authorization`  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html)  |  はい  | 
|  `Cache-Control`  |  CloudFront はヘッダーをオリジンに転送します。  |  いいえ  | 
|  `CloudFront-Forwarded-Proto`  |  CloudFront は、リクエストをオリジンに転送する前にヘッダーを追加しません。 詳細については、「[リクエストのプロトコルに基づいてキャッシュを設定する](header-caching.md#header-caching-web-protocol)」を参照してください。  |  はい  | 
|  `CloudFront-Is-Desktop-Viewer`  |  CloudFront は、リクエストをオリジンに転送する前にヘッダーを追加しません。 詳細については、「[デバイスタイプに基づいてキャッシュを設定する](header-caching.md#header-caching-web-device)」を参照してください。  |  はい  | 
|  `CloudFront-Is-Mobile-Viewer`  |  CloudFront は、リクエストをオリジンに転送する前にヘッダーを追加しません。 詳細については、「[デバイスタイプに基づいてキャッシュを設定する](header-caching.md#header-caching-web-device)」を参照してください。  |  はい  | 
|  `CloudFront-Is-Tablet-Viewer`  |  CloudFront は、リクエストをオリジンに転送する前にヘッダーを追加しません。 詳細については、「[デバイスタイプに基づいてキャッシュを設定する](header-caching.md#header-caching-web-device)」を参照してください。  |  はい  | 
|  `CloudFront-Viewer-Country`  |  CloudFront は、リクエストをオリジンに転送する前にヘッダーを追加しません。  |  はい  | 
|  `Connection`  |  CloudFront は、オリジンにリクエストを転送する前に、このヘッダーを `Connection: Keep-Alive` ヘッダーに置き換えます。  |  いいえ  | 
|  `Content-Length`  |  CloudFront はヘッダーをオリジンに転送します。  |  いいえ  | 
|  `Content-MD5`  |  CloudFront はヘッダーをオリジンに転送します。  |  はい  | 
|  `Content-Type`  |  CloudFront はヘッダーをオリジンに転送します。  |  はい  | 
|  `Cookie`  |  Cookie を転送するように CloudFront を設定すると、`Cookie` ヘッダーフィールドがオリジンに転送されます。そうでない場合、CloudFront は `Cookie` ヘッダーフィールドを削除します。詳細については、「[Cookie に基づいてコンテンツをキャッシュする](Cookies.md)」を参照してください。  |  いいえ  | 
|  `Date`  |  CloudFront はヘッダーをオリジンに転送します。  |  はい、ただし推奨されません  | 
|  `Expect`  |  CloudFront はヘッダーを削除します。  |  はい  | 
|  `From`  |  CloudFront はヘッダーをオリジンに転送します。  |  はい  | 
|  `Host`  |  CloudFront は、リクエストされたオブジェクトに関連付けられたオリジンのドメイン名に値を設定します。 Amazon S3 または MediaStore オリジンのホストヘッダーに基づいてキャッシュすることはできません。  |  はい (カスタム) いいえ (S3 および MediaStore)  | 
|  `If-Match`  |  CloudFront はヘッダーをオリジンに転送します。  |  はい  | 
|  `If-Modified-Since`  |  CloudFront はヘッダーをオリジンに転送します。  |  はい  | 
|  `If-None-Match`  |  CloudFront はヘッダーをオリジンに転送します。  |  はい  | 
|  `If-Range`  |  CloudFront はヘッダーをオリジンに転送します。  |  はい  | 
|  `If-Unmodified-Since`  |  CloudFront はヘッダーをオリジンに転送します。  |  はい  | 
|  `Max-Forwards`  |  CloudFront はヘッダーをオリジンに転送します。  |  いいえ  | 
|  `Origin`  |  CloudFront はヘッダーをオリジンに転送します。  |  はい  | 
|  `Pragma`  |  CloudFront はヘッダーをオリジンに転送します。  |  いいえ  | 
|  `Proxy-Authenticate`  |  CloudFront はヘッダーを削除します。  |  いいえ  | 
|  `Proxy-Authorization`  |  CloudFront はヘッダーを削除します。  |  いいえ  | 
|  `Proxy-Connection`  |  CloudFront はヘッダーを削除します。  |  いいえ  | 
|  `Range`  |  CloudFront はヘッダーをオリジンに転送します。詳細については、「[CloudFront がオブジェクトの部分的リクエスト (レンジ GET) を処理する方法](RangeGETs.md)」を参照してください。  |  はい (デフォルト)  | 
|  `Referer`  |  CloudFront はヘッダーを削除します。  |  はい  | 
|  `Request-Range`  |  CloudFront はヘッダーをオリジンに転送します。  |  いいえ  | 
|  `TE`  |  CloudFront はヘッダーを削除します。  |  いいえ  | 
|  `Trailer`  |  CloudFront はヘッダーを削除します。  |  いいえ  | 
|  `Transfer-Encoding`  |  CloudFront はヘッダーをオリジンに転送します。  |  いいえ  | 
|  `Upgrade`  |  WebSocket 接続が確立されていない限り、CloudFront はヘッダーを削除します。  |  いいえ (WebSocket 接続の場合を除く)  | 
|  `User-Agent`  |  CloudFront はこのヘッダーフィールドの値を `Amazon CloudFront` に置き換えます。ユーザーが使用しているデバイスに基づいて CloudFront でコンテンツをキャッシュする場合は、「[デバイスタイプに基づいてキャッシュを設定する](header-caching.md#header-caching-web-device)」を参照してください。  |  はい、ただし推奨されません  | 
|  `Via`  |  CloudFront はヘッダーをオリジンに転送します。  |  はい  | 
|  `Warning`  |  CloudFront はヘッダーをオリジンに転送します。  |  はい  | 
|  `X-Amz-Cf-Id`  |  CloudFront は、リクエストをオリジンに転送する前に、ビューワーリクエストにヘッダーを追加します。ヘッダー値には、リクエストを一意に識別する暗号化された文字列が含められます。  |  いいえ  | 
|  `X-Edge-*`  |  CloudFront はすべての `X-Edge-*` ヘッダーを削除します。  |  いいえ  | 
|  `X-Forwarded-For`  |  CloudFront はヘッダーをオリジンに転送します。詳細については、「[クライアント IP アドレス](#RequestCustomIPAddresses)」を参照してください。  |  はい  | 
|  `X-Forwarded-Proto`  |  CloudFront はヘッダーを削除します。  |  いいえ  | 
|  `X-HTTP-Method-Override`  |  CloudFront はヘッダーを削除します。  |  はい  | 
|  `X-Real-IP`  |  CloudFront はヘッダーを削除します。  |  いいえ  | 

### HTTP バージョン
<a name="RequestCustomHTTPVersion"></a>

CloudFront は HTTP/1.1 を使用してカスタムオリジンにリクエストを転送します。

### リクエストの最大長と URL の最大長
<a name="RequestCustomMaxRequestStringLength"></a>

パス、クエリ文字列 (ある場合)、ヘッダーを含め、リクエストの最大長は 20480 バイトです。

CloudFront はリクエストから URL を構築します。この URL の最大長は 8192 文字です。

リクエストまたは URL がこの最大制限を超えると、CloudFront は、リクエストヘッダーフィールドが長すぎることを示す HTTP ステータスコード 413 (Request Entity Too Large) をビューワーに返してから、ビューワーへの TCP 接続を終了します。

### OCSP stapling
<a name="request-custom-ocsp-stapling"></a>

オブジェクトに対する HTTPS リクエストをビューワーが送信する際には、ドメインの SSL 証明書が無効になっていないことを CloudFront またはビューワーが認証機関 (CA) に対して確認する必要があります。OCSP Stapling を使用すると、CloudFront で証明書を検証して CA からの応答をキャッシュできるため、クライアントが直接 CA に対して証明書を検証する必要がなくなり、証明書の検証速度が向上します。

同一ドメイン内のオブジェクトに対する多数の HTTPS リクエストを CloudFront が受信した場合は、OCSP Stapling によるパフォーマンス向上がさらに顕著になります。CloudFront エッジロケーション内の各サーバーは、別々の検証リクエストを送信する必要があります。同一ドメインに対する多数の HTTPS リクエストを CloudFront が受信するとすぐに、エッジロケーション内のすべてのサーバーが、SSL ハンドシェイクでパケットに「ステープリング」できるという CA からの応答を受信します。証明書が有効であることをビューワーが確認すると、CloudFront はリクエストされたオブジェクトを提供できます。CloudFront エッジロケーション内でディストリビューションが十分なトラフィックを確保できない場合、新しいリクエストは、CA に対して証明書がまだ検証されていないサーバーに誘導される可能性が高くなります。この場合は、ビューワーが検証ステップを別途実行し、CloudFront サーバーがオブジェクトを提供します。この CloudFront サーバーも CA に検証リクエストを送信するため、同じドメイン名が含まれるリクエストを次に受信したときには、CA からの検証応答が既に存在しているということになります。

### 持続的接続
<a name="request-custom-persistent-connections"></a>

CloudFront がオリジンからレスポンスを取得すると、その期間中に別のリクエストが届くのに備え、数秒間、接続を維持しようとします。持続的接続を維持すると、TCP 接続の再構築に必要な時間と後続のリクエストに対する別の TLS ハンドシェイクの実行に必要な時間を節約できます。

持続的接続の期間を設定する方法など、詳細については、「[キープアライブタイムアウト (カスタムオリジンおよび VPC オリジンのみ)](DownloadDistValuesOrigin.md#DownloadDistValuesOriginKeepaliveTimeout)」セクションの「[すべてのディストリビューション設定リファレンス](distribution-web-values-specify.md)」を参照してください。

### プロトコル
<a name="RequestCustomProtocols"></a>

CloudFront は、以下の項目に基づいて、HTTP または HTTPS リクエストをオリジンサーバーに転送します。
+ ビューワーが CloudFront に送信したリクエストのプロトコル (HTTP または HTTPS)。
+ CloudFront コンソールの [**オリジンプロトコルポリシー**] フィールドの値。または、CloudFront API を使用する場合は、`OriginProtocolPolicy` 複合型の `DistributionConfig` エレメントの値。CloudFront コンソールで使用できるオプションは、[**HTTP のみ**]、[**HTTPS のみ**]、および [**一致ビューワー**] です。

[**HTTP のみ**] または [**HTTPS のみ**] を指定すると、CloudFront では、ビューワーリクエストのプロトコルに関係なく、指定されたプロトコルのみを使用してリクエストをオリジンサーバーに転送します。

[**一致ビューワー**] を指定した場合、CloudFront はビューワーリクエストのプロトコルを使用してリクエストをオリジンサーバーに転送します。ビューワーが HTTP と HTTPS の両方のプロトコルを使用してリクエストを行った場合も、CloudFront がオブジェクトをキャッシュするのは 1 回だけです。

**重要**  
CloudFront が HTTPS プロトコルを使用してリクエストをオリジンに転送し、オリジンサーバーから無効な証明書または自己署名証明書が返された場合、CloudFront は TCP 接続を中断します。

CloudFront コンソールを使用してディストリビューションを更新する方法については、「[ディストリビューションを更新する](HowToUpdateDistribution.md)」を参照してください。CloudFront API を使用してディストリビューションを更新する方法については、*Amazon CloudFront API リファレンス*の「[UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)」を参照してくださいCloudFront。

### クエリ文字列
<a name="RequestCustomQueryStrings"></a>

CloudFront でクエリ文字列パラメータをオリジンに転送するかどうかを構成できます。詳細については、「[クエリ文字列パラメータに基づいてコンテンツをキャッシュする](QueryStringParameters.md)」を参照してください。

### オリジン接続のタイムアウトと試行
<a name="custom-origin-timeout-attempts"></a>

*オリジン接続タイムアウト*は、オリジンへの接続を確立しようとしたときに CloudFront が待機する秒数です。

*オリジン接続試行*は、CloudFront がオリジンへの接続を試行する回数です。

これらの設定により、セカンダリオリジンにフェイルオーバーするか (オリジングループの場合)、ビューワーにエラーレスポンスを返す前に、CloudFront がオリジンへの接続を試行する時間が決まります。デフォルトでは、CloudFront はセカンダリオリジンへの接続を試行したり、エラーレスポンスを返したりする前に 30 秒 (それぞれ 10 秒間の試行が 3 回) 待機します。接続タイムアウトを短くするか、試行回数を減らすか、その両方を行うことで、この時間を短縮できます。

詳細については、「[オリジンのタイムアウトと試行を制御する](high_availability_origin_failover.md#controlling-attempts-and-timeouts)」を参照してください。

### オリジン応答タイムアウト
<a name="request-custom-request-timeout"></a>

*オリジン応答タイムアウト* (*オリジンの読み取りタイムアウト*または*オリジンリクエストタイムアウト*とも呼ばれます) は、次の両方に適用されます。
+ CloudFront がリクエストをオリジンに転送してからレスポンスを受け取るまでの待機時間 (秒)。
+ CloudFront がオリジンからレスポンスのパケットを受け取ってから次のパケットを受け取るまでの待機時間 (秒)。

CloudFront の動作は、ビューワーリクエストの HTTP メソッドによって決まります。
+ `GET` および `HEAD` リクエスト ― 応答タイムアウトの期間内にオリジンが応答しない場合、または応答を停止した場合、CloudFront は接続を中断します。指定された[オリジン接続の試行回数](DownloadDistValuesOrigin.md#origin-connection-attempts)が 1 回を超える場合、CloudFront は完全な応答の取得を再試行します。*オリジン接続の試行回数*設定の値で決められているように、CloudFront は最大 3 回試行します。最後の試行でもオリジンが応答しない場合、CloudFront は同じオリジンのコンテンツに対する別のリクエストを受け取るまで接続を試みません。
+ `DELETE`、`OPTIONS`、`PATCH`、`PUT`、`POST` の各リクエスト – オリジンが読み取りタイムアウトの期間中に応答しない場合、CloudFront は接続を中断し、オリジンへの接続を再試行しません。クライアントは、必要に応じてリクエストを再送信できます。

  

オリジン応答タイムアウトを設定する方法など、詳細については、「[応答タイムアウト](DownloadDistValuesOrigin.md#DownloadDistValuesOriginResponseTimeout)」を参照してください。

### 同一オブジェクトへの同時リクエスト (リクエストを折りたたむ)
<a name="request-custom-traffic-spikes"></a>

CloudFront エッジロケーションがオブジェクトのリクエストを受け取り、オブジェクトが現在キャッシュにないか、有効期限が切れている場合、CloudFront はすぐにオリジンにリクエストを送信します。ただし、同一オブジェクトへの同時リクエストがある場合 (同じキャッシュキーを使用)、CloudFront が最初のリクエストへのレスポンスを受信する前に、同一オブジェクト (同じキャッシュキー) への追加のリクエストがエッジロケーションに届く場合、CloudFront は一時停止してから、追加のリクエストをオリジンに転送します。この短い一時停止により、オリジンでの負荷を減らすことができます。CloudFront は、一時停止中に受け取ったすべてのリクエストに、元のリクエストからのレスポンスを送信します。これは*リクエストの折りたたみ*と呼ばれます。CloudFront ログでは、最初のリクエストは `x-edge-result-type` フィールドで `Miss` と識別され、折りたたまれたリクエストは `Hit` とし識別されます。CloudFront ログの詳細については、「[CloudFront とエッジ関数のログ記録](logging.md)」を参照してください。

CloudFront は、[*キャッシュキー*](understanding-the-cache-key.md)を共有するリクエストのみを折りたたみます。リクエストヘッダーまたはクッキーまたはクエリ文字列に基づいてキャッシュするように CloudFront を設定した場合など、追加のリクエストが同じキャッシュキーを共有しない場合、CloudFront は一意のキャッシュキーを持つすべてのリクエストをオリジンに転送します。

すべてのリクエストの折りたたみを防ぐ場合は、マネージドキャッシュポリシー `CachingDisabled` を使用できます (このポリシーはキャッシュも防ぎます)。詳細については、「[マネージドキャッシュポリシーを使用する](using-managed-cache-policies.md)」を参照してください。

特定のオブジェクトへのリクエストの折りたたみを防ぐ場合は、キャッシュ動作の最小 TTL を 0 に設定し、さらに `Cache-Control: private`、`Cache-Control: no-store`、`Cache-Control: no-cache`、`Cache-Control: max-age=0`、または `Cache-Control: s-maxage=0` を送信するようにオリジンを設定できます。**これらの設定に伴ってオリジンへの負荷が増え、CloudFront が最初のリクエストへのレスポンスを待機中に一時停止される同時リクエストのレイテンシーが高くなります。

**重要**  
現在、[キャッシュポリシー](controlling-the-cache-key.md)、[オリジンリクエストポリシー](controlling-origin-requests.md)、またはレガシーキャッシュ設定で Cookie 転送を有効にした場合、CloudFront はリクエストの折りたたみをサポートしません。

### `User-Agent` ヘッダー
<a name="request-custom-user-agent-header"></a>

ユーザーがコンテンツの表示に使用しているデバイスに基づいて、オブジェクトの異なるバージョンを CloudFront でキャッシュするには、次の 1 つ以上のヘッダーをカスタムオリジンに転送するように CloudFront を設定することをお勧めします。
+ `CloudFront-Is-Desktop-Viewer`
+ `CloudFront-Is-Mobile-Viewer`
+ `CloudFront-Is-SmartTV-Viewer`
+ `CloudFront-Is-Tablet-Viewer`

CloudFront は、`User-Agent` ヘッダーの値に基づいて、これらのヘッダーの値を `true` または `false` に設定した後、リクエストをオリジンに転送します。デバイスが複数のカテゴリに属する場合は、複数の値が `true` になることがあります。たとえば、一部のタブレットデバイスに対して、CloudFront が `CloudFront-Is-Mobile-Viewer` と `CloudFront-Is-Tablet-Viewer` の両方を `true` に設定する場合があります。リクエストヘッダーに基づいてキャッシュするように CloudFront を設定する方法の詳細については、「[リクエストヘッダーに基づいてコンテンツをキャッシュする](header-caching.md)」を参照してください。

`User-Agent` ヘッダーの値に基づいてオブジェクトをキャッシュするように CloudFront を設定できますが、これはお勧めできません。`User-Agent` ヘッダーには可能な値が多数あり、その値に基づいてキャッシュすると、CloudFront がオリジンに転送するリクエストの数が大幅に増加します。

CloudFront が `User-Agent` ヘッダーの値に基づいてオブジェクトをキャッシュするように設定しない場合、CloudFront は以下の値を指定した `User-Agent` ヘッダーを追加して、リクエストをオリジンに転送します。

`User-Agent = Amazon CloudFront`

CloudFront は、ビューワーからのリクエストに `User-Agent` ヘッダーが含まれているかどうかに関係なく、このヘッダーを追加します。ビューワーからのリクエストに `User-Agent` ヘッダーが含まれる場合、CloudFront はそのヘッダーを削除します。

## CloudFront がカスタムオリジンからのレスポンスを処理する方法
<a name="ResponseBehaviorCustomOrigin"></a>

CloudFront がカスタムオリジンからのレスポンスを処理する方法について説明します。

**Contents**
+ [`100 Continue` 件のレスポンス](#Response100Continue)
+ [キャッシュ](#ResponseCustomCaching)
+ [取り消されたリクエスト](#response-custom-canceled-requests)
+ [コンテンツネゴシエーション](#ResponseCustomContentNegotiation)
+ [Cookie](#ResponseCustomCookies)
+ [中断された TCP 接続](#ResponseCustomDroppedTCPConnections)
+ [CloudFront が削除または置き換える HTTP レスポンスヘッダー](#ResponseCustomRemovedHeaders)
+ [キャッシュ可能なファイルの最大サイズ](#ResponseCustomMaxFileSize)
+ [使用できないオリジン](#ResponseCustomOriginUnavailable)
+ [リダイレクト](#ResponseCustomRedirects)
+ [`Transfer-Encoding` ヘッダー](#ResponseCustomTransferEncoding)

### `100 Continue` 件のレスポンス
<a name="Response100Continue"></a>

オリジンは複数の 100-continue レスポンスを CloudFront に送信することはできません。最初の 100-continue レスポンスの後で、CloudFront は HTTP 200 OK レスポンスを予期します。オリジンが最初のレスポンスの後に別の 100-continue レスポンスを送信すると、CloudFront はエラーを返します。

### キャッシュ
<a name="ResponseCustomCaching"></a>
+ オリジンサーバーが `Date` および `Last-Modified` ヘッダーフィールドに有効かつ正確な値を設定していることを確認します。
+ 通常、CloudFront はオリジンからのレスポンスの `Cache-Control: no-cache` ヘッダーを優先します。例外については、「[同一オブジェクトへの同時リクエスト (リクエストを折りたたむ)](#request-custom-traffic-spikes)」を参照してください。

### 取り消されたリクエスト
<a name="response-custom-canceled-requests"></a>

オブジェクトがエッジキャッシュになく、CloudFront がオブジェクトをオリジンから取得したものの、リクエストされたオブジェクトを配信する前にビューワーがセッションを終了すると (ブラウザを閉じるなど)、CloudFront はそのオブジェクトをエッジロケーションにキャッシュしません。

### コンテンツネゴシエーション
<a name="ResponseCustomContentNegotiation"></a>

オリジンが応答で `Vary:*` を返し、対応するキャッシュ動作の [**最小 TTL**] の値が [**0**] の場合、CloudFront はオブジェクトをキャッシュしますが、そのオブジェクトの後続のすべてのリクエストをオリジンに転送して、キャッシュにオブジェクトの最新バージョンが含まれていることを確認します。CloudFront には、`If-None-Match` や `If-Modified-Since` などの条件付きヘッダーは含まれません。その結果、オリジンはすべてのリクエストに応じて CloudFront にオブジェクトを返します。

オリジンが応答で `Vary:*` を返し、対応するキャッシュ動作の [**最小 TTL**] の値が別の値になっている場合、CloudFront は「`Vary`」に記述されている方法で [CloudFront が削除または置き換える HTTP レスポンスヘッダー](#ResponseCustomRemovedHeaders) ヘッダーを処理します。

### Cookie
<a name="ResponseCustomCookies"></a>

キャッシュ動作の Cookie を有効にしており、オリジンが Cookie とオブジェクトを返す場合、CloudFront はオブジェクトと Cookie の両方をキャッシュします。これにより、オブジェクトのキャッシュ可能性が低下します。詳細については、「[Cookie に基づいてコンテンツをキャッシュする](Cookies.md)」を参照してください。

### 中断された TCP 接続
<a name="ResponseCustomDroppedTCPConnections"></a>

オリジンがオブジェクトを CloudFront に返している間に CloudFront とオリジン間の TCP 接続が中断した場合、CloudFront の動作は、オリジンが `Content-Length` ヘッダーをレスポンスに含めたかどうかによって異なります。
+ **Content-Length ヘッダーあり** – CloudFront は、オブジェクトをオリジンから取得すると、ビューワーにオブジェクトを返します。ただし、`Content-Length` ヘッダーの値がオブジェクトのサイズに一致しない場合、CloudFront はオブジェクトをキャッシュしません。
+ **Transfer-Encoding: Chunked** – CloudFront は、オブジェクトをオリジンから取得すると、ビューワーにオブジェクトを返します。ただし、チャンクレスポンスが完了していない場合、CloudFront はオブジェクトをキャッシュしません。
+ **Content-Length ヘッダーなし** – CloudFront はオブジェクトをビューワーに返して、オブジェクトをキャッシュしますが、オブジェクトが完全でない場合があります。`Content-Length` ヘッダーがない場合、CloudFront は、TCP 接続が誤って中断されたか、または故意に中断されたかを判断できません。

`Content-Length` ヘッダーを追加して、CloudFront が不完全なオブジェクトをキャッシュしないように HTTP サーバーを設定することをお勧めします。

### CloudFront が削除または置き換える HTTP レスポンスヘッダー
<a name="ResponseCustomRemovedHeaders"></a>

CloudFront は、オリジンからのレスポンスをビューワーに転送する前に、以下のヘッダーフィールドを削除または更新します。
+ `Set-Cookie` – Cookie を転送するように CloudFront を構成している場合、`Set-Cookie` ヘッダーフィールドがクライアントに転送されます。詳細については、「[Cookie に基づいてコンテンツをキャッシュする](Cookies.md)」を参照してください。
+ `Trailer`
+ `Transfer-Encoding` – オリジンがこのヘッダーフィールドを返す場合、CloudFront は値を `chunked` に設定してビューワーにレスポンスを返します。
+ `Upgrade`
+ `Vary` – 次の点に注意してください。
  + デバイス固有のヘッダーのいずれかをオリジン (`CloudFront-Is-Desktop-Viewer`、`CloudFront-Is-Mobile-Viewer`、`CloudFront-Is-SmartTV-Viewer`、`CloudFront-Is-Tablet-Viewer`) に転送するように CloudFront を設定しており、オリジンが `Vary:User-Agent` を CloudFront に返すように設定している場合、CloudFront は `Vary:User-Agent` をビューワーに返します。詳細については、「[デバイスタイプに基づいてキャッシュを設定する](header-caching.md#header-caching-web-device)」を参照してください。
  + `Accept-Encoding` ヘッダーに、`Cookie` または `Vary` のいずれかを含めるよう設定した場合、CloudFront はビューワーへの応答にその値を含めます。
  + オリジンにヘッダーを転送するように CloudFront を設定し、`Vary` ヘッダー (例えば `Vary:Accept-Charset,Accept-Language`) の CloudFront にヘッダー名を返すようにオリジンを設定した場合、CloudFront はこれらの値を持つ `Vary` ヘッダーをビューワーに返します。
  + CloudFront が `*` ヘッダーの `Vary` 値を処理する詳細については、「[コンテンツネゴシエーション](#ResponseCustomContentNegotiation)」を参照してください。
  + `Vary` ヘッダーで他の値を含めるようにオリジンを設定している場合、CloudFront はその値を削除してからビューワーに応答を返します。
+ `Via` – CloudFront は、ビューワーへの応答で値を次のように設定します。

  `Via: `*http-version* *alphanumeric-string*`.cloudfront.net (CloudFront)`

  例えば、値は次のようになります。

  `Via: 1.1 1026589cc7887e7a0dc7827b4example.cloudfront.net (CloudFront)`

### キャッシュ可能なファイルの最大サイズ
<a name="ResponseCustomMaxFileSize"></a>

CloudFront がキャッシュに保存するレスポンスボディの最大サイズは 50 GB です。これには、`Content-Length` ヘッダーの値を指定しないチャンク転送レスポンスが含まれます。

それぞれ 50 GB 以下のパートのオブジェクトをリクエストする範囲リクエストを使用して、このサイズを超えるオブジェクトをキャッシュするには、CloudFront を使用します。CloudFront がこれらのパートをキャッシュするのは、それぞれが 50 GB 以下であるためです。ビューワーによって、オブジェクトのすべてのパートを取得した後、元の大きなオブジェクトが再構築されます。詳しくは、「[範囲リクエストを使用して大きなオブジェクトをキャッシュする](RangeGETs.md#cache-large-objects-with-range-requests)」を参照してください。

### 使用できないオリジン
<a name="ResponseCustomOriginUnavailable"></a>

オリジンサーバーが使用できないときに、CloudFront がエッジキャッシュに存在するオブジェクトのリクエストを受け取り、そのオブジェクトが (たとえば、`Cache-Control max-age` ディレクティブに指定された期間が経過しているために) 有効期限切れになっている場合、CloudFront は有効期限切れバージョンのオブジェクトを提供するか、またはカスタムエラーページを提供します。カスタムエラーページを設定したときの CloudFront の動作の詳細については、「[カスタムエラーページが設定されている場合に CloudFront がエラーを処理する方法](HTTPStatusCodes.md#HTTPStatusCodes-custom-error-pages)」を参照してください。

場合によって、要求頻度の低いオブジェクトは削除されてエッジキャッシュで使用できなくなることがあります。CloudFront は、削除されたオブジェクトを提供することはできません。

### リダイレクト
<a name="ResponseCustomRedirects"></a>

オリジンサーバーでオブジェクトの場所を変更した場合、リクエストを新しい場所にリダイレクトするようにウェブサーバーを設定できます。リダイレクトを設定すると、ビューワーがオブジェクトに対するリクエストを最初に送信したときに、CloudFront はリクエストをオリジンに送信し、オリジンはリダイレクトで応答します (例: `302 Moved Temporarily`)。CloudFront はリダイレクトをキャッシュし、ビューワーにリダイレクトを返します。CloudFront はリダイレクトには従いません。

リクエストを以下のどちらかの場所にリダイレクトするようにウェブサーバーを構成できます。
+ オリジンサーバーのオブジェクトの新しい URL。ビューワーが新しい URL へのリダイレクトに従う場合、ビューワーは CloudFront をバイパスし、オリジンに直接アクセスします。したがって、オリジンにあるオブジェクトの新しい URL にリクエストをリダイレクトしないようお勧めします。
+ オブジェクトの新しい CloudFront URL。新しい CloudFront URL を含むリクエストがビューワーから送信されると、CloudFront は、オリジンの新しい場所からオブジェクトを取得し、エッジロケーションにキャッシュした後、ビューワーにオブジェクトを返します。オブジェクトに対する以降のリクエストはエッジロケーションによって処理されます。これにより、オリジンのオブジェクトを要求するビューワーに関連するレイテンシーと負荷が回避されます。ただし、オブジェクトに対する新しいリクエストごとに、CloudFront への 2 つのリクエストに対する料金がかかります。

### `Transfer-Encoding` ヘッダー
<a name="ResponseCustomTransferEncoding"></a>

CloudFront は、`chunked` ヘッダーの `Transfer-Encoding` 値のみをサポートします。オリジンが `Transfer-Encoding: chunked` を返した場合、CloudFront は、エッジロケーションで受け取ったオブジェクトをクライアントに返し、そのオブジェクトをチャンク形式でキャッシュして後続のリクエストに備えます。

ビューワーが `Range GET` をリクエストし、オリジンが `Transfer-Encoding: chunked` を返す場合、CloudFront はリクエストされた範囲ではなくオブジェクト全体をビューワーに返します。

レスポンスのコンテンツ長を事前に決定できない場合は、チャンクエンコーディングを使用することをお勧めします。詳細については、「[中断された TCP 接続](#ResponseCustomDroppedTCPConnections)」を参照してください。