このトピックでは、ResponseCache ポリシーを使用している場合に、Edge が HTTP/1.1 キャッシング ヘッダーを処理する仕組みについて説明します。Apigee Edge は現在、バックエンドのターゲット(送信元)サーバーから受信した HTTP/1.1 キャッシング ヘッダーと、ディレクティブのサブセットをサポートしています(サポートされていない機能については、このトピックで一覧として示しています)。
また、Edge は、特定のヘッダーを受信すると、ディレクティブに応じてアクションを開始します。場合によっては、これらの HTTP/1.1 キャッシュ ヘッダーは、ResponseCache ポリシーで指定された動作をオーバーライドします。たとえば、Cache-Control ヘッダーがバックエンド サーバーから返された場合は、ヘッダーの s-maxage ディレクティブでポリシー内の他の有効期限設定をオーバーライドできます。
| ヘッダー | サポート |
|---|---|
| Cache-Control | バックエンド送信元サーバーから返されるレスポンスではサポートされますが、クライアント リクエストではサポートされません。Edge はディレクティブのサブセットをサポートします。 |
| Expires | サポートされます。オーバーライドできます。 |
| エンティティ タグ(ETags) | If-Match と If-None-Match の特定の動作。 |
| If-Modified-Since | GET リクエストでは、有効なキャッシュ エントリが存在している場合でも、ヘッダーは送信元サーバーに渡されます。 |
| Accept-Encoding | Edge は受信ヘッダーに応じて、圧縮したレスポンスまたは圧縮していないレスポンスを送信します。 |
Cache-Control
Apigee Edge は、バックエンドの送信元サーバーから返されたレスポンスでのみ Cache-Control ヘッダーをサポートします(HTTP/1.1 仕様では、クライアント リクエストと送信元サーバー レスポンスの両方で Cache-Control ヘッダーを使用できます)。送信元サーバーには、Apigee Edge API プロキシで定義されたターゲット エンドポイントと、TargetServer API 呼び出しで作成されたエンドポイントの両方が含まれます。
Cache-Control のサポート制限事項
Apigee Edge は、HTTP/1.1 仕様で定義されている Cache-Control レスポンス ヘッダー機能のサブセットをサポートしています。次の点を考慮してください。
- Apigee Edge は、受信クライアント リクエストで受信した
Cache-Controlヘッダーをサポートしません。 - Apigee Edge は、パブリック キャッシュの概念に適合する対象のみをサポートします。HTTP 仕様では、
Cache-Controlはパブリック(共有)またはプライベート(シングル ユーザー)のいずれでも使用できます。 - Apigee Edge は、HTTP/1.1 仕様の
Cache-Controlレスポンス ディレクティブのサブセットのみをサポートします。詳細については、Cache-Control レスポンス ヘッダー ディレクティブのサポートをご覧ください。
Cache-Control レスポンス ヘッダー ディレクティブのサポート
Apigee は、送信元サーバーからのレスポンスで、HTTP/1.1 仕様のサブセット ディレクティブをサポートします。次の表は、HTTP Cache-Control レスポンス ヘッダー ディレクティブに対する Apigee Edge のサポート状況を示しています。
こちらに記載されているディレクティブの詳細については、HTTP/1.1 仕様の Cache-Control をご覧ください。
| Cache-Control ディレクティブ | Apigee Edge がディレクティブを処理する方法 |
cache-extension |
サポートされていません。 |
max-age |
ResponseCache ポリシーで このディレクティブは |
must-revalidate |
サポートされていません。すべてのキャッシュ エントリは、期限切れになると Apigee Edge によって直ちに削除されます。 |
no-cache |
Edge は送信元のレスポンスをキャッシュしますが、そのレスポンスは、後続のクライアント リクエストへの対応に使用する前に、送信元サーバーで再検証する必要があります。このルールにより、キャッシュからレスポンスを返す必要があることを示すために送信元は「304 Not Modified」レスポンスを返すことができ、その結果、レスポンス全体を返すのに必要な処理を軽減できます。送信元サーバーが完全なレスポンスを返す場合は、既存のキャッシュ エントリを置換します。このディレクティブに指定されたフィールド名は無視されます。 |
no-store |
サポートされていません。 |
no-transform |
サポートされていません。 |
private |
サポートされていません。このディレクティブを受信した場合、送信元のレスポンスはキャッシュされません。フィールド名は無視されます。 |
proxy-revalidate |
サポートされていません。すべてのキャッシュ エントリは、期限切れになると Apigee Edge によって直ちに削除されます。 |
public |
他のディレクティブが別の処理を命令している場合でも、Edge は送信元のレスポンスをキャッシュします。HTTP/1.1 仕様では、このルールの例外となるのは、レスポンスに Authorization ヘッダーが含まれている場合のみです。 |
s-maxage |
ResponseCache ポリシーで このディレクティブは、 |
有効期限
ResponseCache ポリシーの UseResponseCacheHeaders フラグが true に設定されている場合、Edge は Expires ヘッダーを使用してキャッシュ エントリの有効期間(TTL)を決定できます。このヘッダーは、レスポンスのキャッシュ エントリが古くなったと見なされる日時を指定します。このヘッダーにより、サーバーはタイムスタンプに基づいて、キャッシュされた値を返せる期限を通知できます。
Expires ヘッダーに使用できる日付形式については、HTTP/1.1 仕様をご覧ください。例:
Expires: Thu, 01 Dec 1994 16:00:00 GMT
HTTP の日付 / 時刻形式の詳細については、HTTP/1.1 仕様の日付 / 時刻形式をご覧ください。
Expires ヘッダーの詳細については、HTTP/1.1 仕様のヘッダー フィールドの定義をご覧ください。
ETag
エンティティ タグ(ETag)は、要求されたリソースに関連付けられる識別子です。サーバーは ETag を使用して、要求されたリソースと、キャッシュされた関連リソースが一致しているかどうかを判定できます。たとえば、要求されたリソースが現在キャッシュされているリソースと一致しない場合、サーバーはレスポンスを再度キャッシュできます。ETag が一致した場合、サーバーはキャッシュされたリソースを返すことができます。
ターゲット エンドポイントが ETag を付けてレスポンスを Edge に送り返すと、Edge はレスポンスとともに ETag をキャッシュします。
エンティティ タグの詳細については、HTTP/1.1 仕様のプロトコル パラメータをご覧ください。
If-Match
If-Match リクエスト ヘッダーを使用しており、ヘッダー内の ETag がキャッシュされた ETag と一致する場合、キャッシュされたエンティティは現在のエンティティです。GET 以外のリクエストで If-Match ヘッダーを指定すると、送信元サーバーに渡され、送信元のキャッシュ機能でリクエストを処理する機会が与えられます。
If-Match の詳細については、HTTP/1.1 仕様のヘッダー フィールドの定義をご覧ください。
Edge が If-Match ヘッダーを含む受信 GET リクエストをクライアントから受信した場合:
| 条件 | 処理 |
|---|---|
If-Match ヘッダーは、1 つ以上の ETag を指定します。 |
|
If-Match ヘッダーに「*」が指定されている |
リクエストは送信元サーバーに渡され、送信元のキャッシュ機能でリクエストを処理する機会が与えられます。 |
| 同じリクエスト URI を持つキャッシュ エントリが見つかったものの、優先度の低い Etag のみが含まれている | クライアントに返す前に、送信元サーバーでエントリを再検証する必要があります。 |
| 送信元サーバーから ETag を受信した | ETag は変更なしでクライアントに返されます。 |
If-None-Match
If-None-Match ヘッダーを使用しており、ヘッダー内の ETag がキャッシュ内の ETag と一致しない場合、キャッシュされたエンティティは現在のエンティティです。このヘッダーを含む GET 以外のリクエストは送信元サーバーに渡されます。
Edge がこのヘッダーを含む受信 GET リクエストを受信した場合:
| 条件 | 処理 |
|---|---|
If-None-Match ヘッダーは、1 つ以上の ETag を指定します。 |
|
|
|
Edge は「304 Not Modified」ステータスを返します。 |
| 同じリクエスト URI を持つキャッシュ エントリが見つかったものの、優先度の低い Etag のみが含まれている | Edge がクライアントに返す前に、送信元サーバーでエントリを再検証する必要があります。 |
| Edge が送信元サーバーから ETag を受信した | ETag は変更なしでクライアントに返されます。 |
If-Modified-Since
Apigee Edge が GET リクエストで If-Modified-Since ヘッダーを受け取ると、有効なキャッシュ エントリが存在する場合でも、そのヘッダーが送信元サーバーに渡されます。
この処理で、Apigee Edge を経由しなかったリソースの更新に確実に対応します。送信元サーバーが新しいエンティティを返す場合、Edge は既存のキャッシュ エントリを新しい値に置換します。サーバーが「304 Not Modified」ステータスを返し、キャッシュされたレスポンスの Last-Modified ヘッダーが変更されていないことを示している場合、Edge がレスポンス値を返します。
Accept-Encoding
受信リクエストに gzip、deflate、または compress の値を持つヘッダー Accept-Encoding が含まれている場合、送信元サーバーは圧縮データで応答します。後続のリクエストに Accept-Encoding ヘッダーが含まれていない場合、それらの処理では応答が圧縮されていないことが想定されます。Apigee のレスポンス キャッシング メカニズムでは、送信元サーバーに戻ることなく、受信ヘッダーに応じて、圧縮したレスポンスと圧縮していないレスポンスの両方を送信できます。
Accept ヘッダー値がキャッシュキーに追加されるように設定することで、キャッシュされるアイテムごとにキー情報を拡張できます。詳細については、Response Cache ポリシーの「キャッシュキーを構成する」をご覧ください。