web-dev-qa-db-ja.com

HTTPでPOSTメソッドをキャッシュできますか?

非常に単純なキャッシングのセマンティクスを使用します。パラメーターが同じ場合(そしてもちろんURLも同じ場合)、ヒットします。それは可能ですか?おすすめですか?

144
flybywire

セクション9.5(POST)の対応する RFC 2616 を使用すると、POSTメッセージへのresponse適切なヘッダーを使用します。

このメソッドへの応答は、応答に適切なCache-ControlまたはExpiresヘッダーフィールドが含まれていない限り、キャッシュできません。ただし、303(その他を参照)応答を使用して、キャッシュ可能なリソースを取得するようユーザーエージェントに指示することができます。

POSTrequest

一部のHTTPメソッドは、キャッシュによってエンティティを無効にする必要があります。これは、Request-URI、またはLocationまたはContent-Locationヘッダー(存在する場合)によって参照されるエンティティです。これらの方法は次のとおりです。

  - PUT
  - DELETE
  - POST

これらの仕様がどのように意味のあるキャッシュを可能にするかは私には明らかではありません。

94

RFC 2616セクション9.5によると:

「POSTメソッドへの応答はキャッシュ可能ではありません。応答に適切なCache-ControlまたはExpiresヘッダーフィールドが含まれている場合を除きます。」

そう、はい、あなたはPOST要求応答をキャッシュできますが、適切なヘッダーで到着した場合のみです。ほとんどの場合、応答をキャッシュしたくありません。しかし、場合によってはサーバーにデータを保存していません-完全に適切です。

ただし、現在のFirefox 3.0.10を含む多くのブラウザは、ヘッダーに関係なくPOST応答をキャッシュしません。IEこの点でより賢く動作します。

ここで、RFC 2616 S. 13.10に関する混乱を解消したいと思います。 POST URIのメソッドは、ここで述べているように「キャッシュのためにリソースを無効化する」ことはありません。キャッシュコントロールヘッダーがより長い期間。

63
reBoot

全体:

基本的に POSTはべき等の操作ではありません 。したがって、キャッシュに使用することはできません。 GETはべき等の操作である必要があるため、一般的にキャッシングに使用されます。

HTTP 1.1 RFC 2616 S. 9.1 のセクション9.1を参照してください。

GETメソッドのセマンティクス以外:

POSTメソッド自体は、リソースに何かを投稿することを意味的に意味します。POST一度か二度か三度何かをすれば、各リクエストは重要であり、サーバーに配信される必要があります。

PUTメソッド自体は、意味的にリソースを配置または作成するためのものです。これはべき等の操作ですが、その間にDELETEが発生した可能性があるため、キャッシュには使用されません。

DELETEメソッド自体は、意味的にリソースを削除することを意味します。これはべき等の操作ですが、その間にPUTが発生する可能性があるため、キャッシングには使用されません。

クライアント側のキャッシングについて:

Webブラウザは、前のPOST=操作からの応答があった場合でも、常にリクエストを転送します。たとえば、Gmailで数日離れたメールを送信する場合があります。 、ただし両方のメールを送信する必要があります。

プロキシキャッシュについて:

サーバーにメッセージを転送するプロキシHTTPサーバーは、GETまたはHEAD要求以外はキャッシュしません。

サーバーのキャッシュについて:

デフォルトでは、サーバーはキャッシュをチェックしてPOSTリクエストを自動的に処理しません。ただし、もちろん、POSTリクエストをアプリケーションに追加したり、であり、パラメータが同じ場合に読み取る独自のキャッシュを持つことができます。

リソースの無効化:

HTTP 1.1 RFC 2616 S. 13.1 を確認すると、POSTメソッドはキャッシュのためにリソースを無効にする必要があることがわかります。

31
Brian R. Bondy

POST応答をキャッシュする場合、Webアプリケーションの指示に従う必要があります。これは、「応答に適切なCache-ControlまたはExpiresヘッダーフィールドが含まれていない限り、このメソッドへの応答はキャッシュできない」という意味です。

POSTの結果がべき等であるかどうかを知っているアプリケーションが、必要かつ適切なキャッシュ制御ヘッダーを付加するかどうかを決定すると、安全に想定できます。キャッシングが許可されていることを示唆するヘッダーが存在する場合、アプリケーションはPOSTが実際にはスーパーGETであることを通知しています。 POSTの使用は、べき等操作を実行するために必要な不必要で無関係な(キャッシュキーとしてのURIの使用)データの量のためにのみ必要でした。

次のGETは、この仮定の下でキャッシュから提供できます。

キャッシュ可能な応答とキャッシュ不可の応答を区別するために必要な正しいヘッダーをアタッチできないPOST応答は、無効なキャッシング結果のせいです。

ただし、キャッシュにヒットする各POSTには、条件付きヘッダーを使用した検証が必要です。これは、キャッシュコンテンツを更新して、オブジェクトの有効期限が切れるまでPOSTの結果が要求への応答に反映されないようにするために必要です。

7
JohnS

実際にサイトのデータを変更しないものであれば、GETリクエストである必要があります。フォームであっても、取得リクエストとして設定できます。他の人が指摘しているように、POSTの結果をキャッシュすることはできますが、POSTは定義によりデータを変更しているため、意味を理解できません。

4
Kibbee

マークノッティンガムは、POSTの応答をキャッシュすることが可能かどうかを分析しました。キャッシュを利用したい後続のリクエストは、GETまたはHEADリクエスト。 httpbis も参照してください。

POSTは、識別された状態の表現を処理しません(100のうち99回)。ただし、処理する場合が1つあります。サーバーが要求URIと同じContent-Locationヘッダーを設定することにより、このPOST応答がそのURIの表現であると言うために道を外れたとき。 POST応答は、同じURIに対するGET応答のようなものです。キャッシュして再利用できますが、将来のGET要求に対してのみ使用できます。

https://www.mnot.net/blog/2012/09/24/caching_POST

2
dschulten

もちろん可能です。 POSTサーバーに送信されたリクエストをキャッチし、送信されたデータをキャッシュして後で再送信する場合-汗をかきません。

「状態」に関して難しい部分があります。ユーザーに送り返すデータが実際に同じであるとどのように決定しますか?彼のCookieが変更された場合はどうなりますか?それにより、返送するデータが変更されますか?

ユーザーがあなたのホームページにPOSTリクエストを行い、最後にそれを行った後、別のユーザーがメッセージを送信しました(サイト内のシステムを使用)。)それを状態の変化として識別し、ホームページを新しいバージョンで送信し、次にホームページをロードしたときにメッセージに関する通知をユーザーに送信します。POSTパラメーター同じだ。

1
Shalom Craimer