9

私は、ブラウザーではなく、デバイスによってのみ消費される RESTful Web サービスを作成しました。デバイスは、所有者の既存の家庭用ルーターを介してインターネットにアクセスし、ルーターを介して 30 秒ごとに HTTP 要求を送信することにより、Web サービスと通信します。これらのリクエストのほとんどは、Web サービスにデバイスの新しい情報があるかどうかを確認するための「ポーリング」リクエストです。

ISP 透過プロキシがリクエストを傍受し、キャッシュされたレスポンスを返すのを防ぎたいです。これを行う1つの方法は、リクエストのURLの最後にランダムなクエリ文字列を追加して、プロキシをだましてそれが一意のリクエストであると思わせることです。例えば:

http://webservicedomain.com/poll/?randomNumber=384389

私にはこれを行う能力がありますが、これが最善の方法ですか?ちょっとハックのようです。

4

3 に答える 3

15

これを実現するには、 HTTP の Cache-Control ヘッダーを使用する必要があります。

応答では、次を送信する必要があります。

Cache-Control: private, must-revalidate, max-age=0
  • private - 応答メッセージのすべてまたは一部が 1 人のユーザーを対象としており、共有キャッシュによってキャッシュされてはならないことを示します。
  • max-age=0 - クライアントが経過時間が 0 秒以下の応答を受け入れる用意があることを示します。つまり、応答はすぐに古くなります。
  • must-revalidate - キャッシュによって受信された応答に存在する場合、そのキャッシュは、元のサーバーで最初に再検証せずに、エントリが古くなった後、後続の要求に応答するためにエントリを使用してはなりません (MUST NOT)。

レガシー HTTP/1.0 中間サーバーのプラグマ ヘッダーも送信する必要があります。

Pragma: no-cache

関連読書:

于 2012-08-04T13:40:01.840 に答える
1

暗号化された接続を使用してみてください。キャッシュプロキシは、暗号化された通信からの応答を保存することは想定されていないと思います。

1 つの解決策は、サーバーで HTTPS を構成することです。別の解決策は、SSL プロキシの 1 つを使用して要求を HTTP サーバーに送信するようにクライアントを構成することです。

于 2012-08-02T13:32:44.807 に答える
1

もちろん、適切な Cache-control およびその他のヘッダーを使用して、POST と出来上がりを使用してください。それはあなたが述べた問題を解決するかもしれません。

あなたはこれを見たいと思うかもしれません --キャッシングに関する議論

その後、余分なパラメーター パスも回避できます。

于 2012-08-04T13:34:40.497 に答える