2012-10-11 31 views
5

我有一個Web服務器,它爲特定的URL提供了一個ETag。當瀏覽器執行對這個URL的請求時,它提供了http-header「If-None-Match」與包含在來自該URL的服務器的先前響應中的ETag值。現在,如果我以編程方式添加請求頭「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

,如果我編程添加請求頭「如果-Modified-Since的」並將其設置爲一個或者是將來或過去的日期(無所謂),瀏覽器停止發送「如果 - 無 - 匹配「-header。

他們不應該,如果服務器提供了ETag和給定的資源Last-Modified頭:

HTTP/1.1客戶端[...]如果兩個實體標籤和最後修改的值是原始服務器提供的 ,應該在 緩存條件請求中使用兩個驗證器。這允許HTTP/1.0和 HTTP/1.1緩存正確響應。

編輯:調用XmlHttpRequest.open()時,實施準備使用nsIHttpChannel的請求,使用等的If-Modified-SinceIf-None-Match頭,如果能找到一個本地緩存項目。

現在,當您撥打If-(Un)Modified-SinceIf-None-Match呼叫SetRequestHeader()時,它會清除請求中的兩個標頭並設置您的值。

+0

服務器不提供Last-Modified標頭。瀏覽器必須設置If-Modified-Since標頭(實際上,只有IE需要它)的原因是爲了防止IE的過度激進的緩存。在我的代碼中,我將If-Modified-Since設置爲當前時間,另外我還設置了「Cache-Control」:「max-age = 0」。 – Tore

+0

@Tore請參閱編輯。這是XHR的實現。如果您通過設置任何相關頭文件來覆蓋內置緩存,它將刪除它所設置的所有緩存頭文件。 – CodeCaster

+0

你的意思是setRequestHeader(),而不是setResponseHeader()? – Tore

相關問題