5

特定のURLにETagを提供するWebサーバーがあります。ブラウザがこのURLのリクエストを実行すると、http-header "If-None-Match"に、そのURLに対するサーバーからの以前の応答に含まれているETag値が提供されます。ここで、プログラムでリクエストヘッダー「If-Modified-Since」を追加し、それを未来または過去の日付に設定すると(関係ありません)、ブラウザは「If-None-Match」ヘッダーの送信を停止します。私はこれをFireFoxとChromeの両方で見ました(他のブラウザではテストされていません)。HTTP / 1.1仕様から、これが当てはまるはずだと結論付けることはできません。なぜこれが起こるのですか?

シナリオを再現する簡単なコード例を次に示します。このコードは、サーバーがEtagヘッダーで応答することを前提としています。

var request = new XMLHttpRequest();
request.open("GET", someUrl, true);
request.onreadystatechange = function(){};

// This statement makes the browser stop sending the "If-None-Match" header
request.setRequestHeader("If-Modified-Since", "Sat, 29 Oct 1994 19:43:31 GMT"); 

request.send(null);
4

1 に答える 1

4

ここで、プログラムでリクエストヘッダー「If-Modified-Since」を追加し、それを未来または過去の日付に設定すると(関係ありません)、ブラウザは「If-None-Match」ヘッダーの送信を停止します。

サーバーが特定のリソースにEtagヘッダーとLast-Modifiedヘッダーの両方を提供している場合は、そうすべきではありません。

HTTP / 1.1クライアント[...]エンティティタグとLast-Modified値の両方がオリジンサーバーによって提供されている場合、キャッシュ条件付きリクエストで両方のバリデーターを使用する必要があります。これにより、HTTP/1.0キャッシュとHTTP/1.1キャッシュの両方が適切に応答できるようになります。

編集:を呼び出すとき、実装は、ローカルにキャッシュされたアイテムを見つけることができる場合は、特にヘッダーをXmlHttpRequest.open()使用して、リクエストを準備します。nsIHttpChannelIf-Modified-SinceIf-None-Match

SetRequestHeader()これで、またはのいずれかを使用して呼び出すとIf-(Un)Modified-Since、リクエストIf-None-Matchから両方のヘッダーがクリアされ、値が設定されます。

于 2012-12-11T11:47:39.670 に答える