169

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

4

9 に答える 9

105

対応するRFC 2616のセクション 9.5 (POST) では、適切なヘッダーを使用すると、POST メッセージへの応答のキャッシュが許可されます。

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

同じ RFC のセクション 13 (HTTP でのキャッシング) で、キャッシュは POST要求の後に対応するエンティティを無効にする必要があると明示的に述べていることに注意してください。

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

  - PUT
  - DELETE
  - POST

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

これは、RFC 2616 を廃止するRFC 7231 (セクション 4.3.3.) にも反映され、さらに明確化されています。

POST 要求への応答は、明示的な鮮度情報が含まれている場合にのみキャッシュ
可能です ([RFC7234] のセクション 4.2.1 を参照)。
ただし、POST キャッシングは広く実装されていません。オリジンサーバーが、クライアントが後でGETで再利用できる方法でPOSTの結果をキャッシュできるようにしたい場合、オリジンサーバーは、結果とContent-Locationを含む200(OK)応答を送信できます(MAY)。 POST の有効なリクエスト URI と同じ値を持つヘッダー フィールド (セクション 3.1.4.2)。

これによれば、キャッシュされた POST の結果 (この機能がサーバーによって示されている場合) は、同じ URI に対する GET 要求の結果として後で使用できます。

于 2009-03-09T12:50:42.277 に答える
73

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

「応答に適切な Cache-Control または Expires ヘッダー フィールドが含まれていない限り、POST メソッドへの応答はキャッシュできません。」

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

ただし、現在の Firefox 3.0.10 を含む多くのブラウザーは、ヘッダーに関係なく POST 応答をキャッシュしないことに注意してください。IE は、この点でよりスマートに動作します。

ここで、RFC 2616 S. 13.10 に関するいくつかの混乱を解消したいと思います。一部の人がここで述べているように、URI の POST メソッドは「キャッシュのためにリソースを無効化」しません。キャッシュ制御ヘッダーが長期間の鮮度を示していたとしても、その URI の以前にキャッシュされたバージョンを古くします。

于 2009-05-06T04:57:04.443 に答える
34

全体:

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

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

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

POST メソッド自体は、リソースに何かを投稿することを意味しています。POST をキャッシュすることはできません。何かを 1 回対 2 回対 3 回行うと、毎回サーバーのリソースが変更されるからです。各リクエストは重要であり、サーバーに配信する必要があります。

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

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

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

Web ブラウザーは、以前の POST 操作からの応答がある場合でも、常に要求を転送します。たとえば、gmail でメールを数日おきに送信できます。件名と本文が同じ場合もありますが、両方のメールを送信する必要があります。

プロキシ キャッシングについて:

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

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

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

リソースの無効化:

HTTP 1.1 RFC 2616 S. 13.10を確認すると、POST メソッドがキャッシュ用のリソースを無効にする必要があることが示されています。

于 2009-03-09T13:04:28.703 に答える
3

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

于 2009-03-09T12:55:37.897 に答える
-3

POST はステートフル Ajax で使用されます。POST に対してキャッシュされた応答を返すと、通信チャネルとメッセージ受信の副作用が無効になります。これは非常に悪いです。追跡するのも本当に苦痛です。反対することを強くお勧めします。

些細な例としては、副次的な効果として、今週の給与 $10,000 を支払うというメッセージがあります。あなたは「OK、それは通りました!」を得たくありません。先週キャッシュされたページバック。他の、より複雑な実世界のケースは、同様の陽気さをもたらします。

于 2013-06-11T20:57:09.957 に答える