2012-07-06 52 views
42

HTTP響應頭中的Expires: 0Expires: -1之間的區別是什麼? RFC 2616定義爲無效的日期格式,尤其包括值「0」,因爲已經過期。但是,某些服務器(例如www.google.de)使用Expires: -1進行回覆。HTTP Expires標頭值「0」和「-1」

與使用-1而不是0相比有優勢嗎?或者這對於某些損壞的HTTP客戶端甚至是需要的嗎?

+4

它沒有將''0''定義爲「已過期」 - 它將「無效日期格式」,*包括*'「0」'定義爲「已過期」 – 2012-07-06 07:30:57

+0

這是正確的,謝謝你的提示。但在我看來,在指定「無效的日期格式」時應該首選「0」。 – scai 2012-07-06 07:32:47

+2

不,首選項(表示在下一段中)是使用有效的日期格式,其中包含與「Date」標頭相同的值,以指示已過期。 – 2012-07-06 07:34:20

回答

29

問題在於Internet Explorer(特別是舊版本)處理Expires頭的失效方式。 IE使用Trident佈局引擎和WinINET API來處理HTTP請求。正如你可能知道過期時間可以在HTTP頭中指定

Expires: 0 

或者meta標籤

<meta http-equiv="Expires" content="0"> 

在第二種情況下,到期成爲響應內容的一部分(不是頭內容),所以這將是processed by Trident and then propagated to WinINET

如果下載的WinINET具有無效的響應Expires頭(例如 一個不包含有效的值HTTPDATE),並且沒有其他高速緩存 指令,它將標記文件在一小時前已過期。然而,三叉戟卻沒有這樣的邏輯。如果您指定了無效時間,則 Trident抓取當前時間戳並將其用作到期。 如果遇到 Pragma:no-cache指令,Trident也會使用當前時間戳。如果用戶在處理HTTP/404爲 的同一秒內嘗試重新導航到當前文檔 ,則現有高速緩存 條目的錯誤更新到期將導致它被視爲該請求的新鮮處理。如果 用戶點擊刷新按鈕或F5,緩存將被繞過,並且將顯示404頁面。

換句話說Expires: 0並不總是會導致立即資源到期,因此應避免Expires: [some valid date in the past]應改爲使用。

+1

這就是我正在等待的「一些破壞的HTTP客戶端」的答案,並解釋了「Expires:-1」的原因,謝謝! :) – scai 2012-07-08 19:55:31

+9

3 upvotes?有人甚至讀過答案嗎?根據文章,'Expires:-1'和'Expires:0'之間*沒有區別。 – user123444555621 2012-12-18 05:31:18

+4

這是正確的。這篇文章只解釋了HTML meta元素中錯誤處理的* Expires = 0 *。關於* Expires = -1 *或其他錯誤處理的HTTP標頭中的Expires值,沒有一個單詞。 – scai 2013-02-25 09:13:57

8

Expires:-1 Expires標頭指定何時應認爲內容已過時。值-1表示內容立即過期,並且在再次顯示之前將不得不重新請求。 http://www.httpwatch.com/httpgallery/headers/

max-age = 0只是簡單地告訴緩存(和用戶代理)響應過時了,所以他們應該在使用之前重新驗證響應(例如使用If-Not-Modified頭)緩存副本,而no-cache告訴他們在使用緩存副本之前必須重新驗證。

更多信息考慮http://www.w3.org/Protocols/HTTP/1.1/rfc2616.pdf

+2

謝謝,但我的問題特別針對'Expires:0'和'Expires:-1'之間的區別。 – scai 2015-03-10 08:23:15

+0

+1雖然這不是問題的真正答案,但它與該主題相關。在我看來,如果你試圖增加過期時間:-1或0,你可能也會使用max-age = 0。可能應該是一個評論,而不是一個答案。 – 2016-04-20 15:24:29

1

使用「-1」是無效的,將被視爲等同於「0」。它根本不應該觸發重新加載。

請注意:在某些瀏覽器中,它可能會額外提供1小時或使用默認的到期時間進行兌現。

1所以最好還是給它一個正確的舊日期,如:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> 
<meta http-equiv="Pragma" content="no-cache" /> 
<meta http-equiv="Expires" content="Tue, 01 Jan 1980 1:00:00 GMT" /> 

對於正式的工作,我建議給 當前日期時間過期元,而不是使用舊的固定日期(這將使像谷歌搜索引擎將網站標記爲老不上切頂所示)

2 - 如果你的後臺是PHP,你可以處理它喜歡:

<meta http-equiv="Expires" content="<?php echo gmdate('D, d M Y H:i:s', time()-3600) . ' GMT' ?>" /> 

PS:爲了以防萬一,我給了一個小時。