2012-10-11 4 views
5

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

シナリオを再現する簡単なコード例を次に示します。このコードは、サーバーが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); 
+1

代わりにhttp://greenbytes.de/tech/webdav/draft-ietf-httpbis-p4-conditional-21.htmlを読むことができます。 –

答えて

4

、私はプログラム的「以来、変更される場合は、」リクエストヘッダを追加し、(関係ない)のいずれかの将来や過去の日付に設定し、ブラウザが「送信を停止した場合If-None-Match "-header。

彼らべきではない、サーバーは両方で提供する場合Etag及び所与のリソースの最終-Modifiedヘッダ:

HTTP/1.1クライアント[...]もしエンティティタグの両方と最終変更値はオリジンサーバによって提供された であり、 キャッシュ条件付き要求で両方のバリデータを使用すべきである(SHOULD)。これにより、HTTP/1.0と HTTP/1.1キャッシュの両方が適切に応答することができます。

編集:XmlHttpRequest.open()を呼び出すときに、実装は、それがローカルにキャッシュされたアイテムを見つけることができるかどうか他の人の間でIf-Modified-SinceIf-None-Matchヘッダを使用して、nsIHttpChannelを使用して要求を準備します。

SetRequestHeader()If-(Un)Modified-SinceまたはIf-None-Matchに設定すると、リクエストの両方のヘッダーがクリアされ、値が設定されます。

+0

サーバーはLast-Modifiedヘッダーを提供しません。ブラウザがIf-Modified-Sinceヘッダを設定しなければならない理由は(実際はIEのみが必要です)、IEの過度に積極的なキャッシュを防ぐためです。私のコードでは、If-Modified-Sinceを現在の時刻に設定し、さらに「Cache-Control」:「max-age = 0」を設定しました。 – Tore

+0

@Tore編集を参照してください。これを行うのはXHRの実装です。関連するヘッダーを設定して組み込みキャッシュをオーバーライドすると、設定されているすべてのキャッシュヘッダーが削除されます。 – CodeCaster

+0

setResponseHeader()ではなく、setRequestHeader()を意味しますか? – Tore

関連する問題