2011-12-08 24 views
4

我不知道這是一個錯誤或http規範的功能,或者我不理解的東西好。http:條件得到不給機會刷新標題沒有發送身體

我有一個資源在一週的開始每週最多更改一次。如果沒有變化,那麼上週的資源在整個星期內仍然有效。 (對於我們所有的測試,我們修改了一週時間爲五分鐘,但我認爲我們的觀察結果仍然有效)。

首先我們發送資源的標題爲Expires: next Monday。瀏覽器從緩存中檢索整整一週。如果在星期一我們有一個新的資源,那麼它會檢索到它的新標題,並且一切正常。

資源未更新時發生此問題。爲了響應條件,我們的應用程序(Java + Tomcat)發送了帶有Expires: next Monday的新標頭,但沒有正文。但是我們的前端服務器(apache)刪除了這個頭文件,因爲規範說如果資源沒有改變,你不應該發送新的頭文件。所以現在永遠(直到資源發生變化),當我們希望瀏覽器直接從緩存中繼續投放時,瀏覽器將發送一個條件獲取。

是否有符合規範的方式來更新標頭而不更新正文? (或再次發送)

和子問題:如何使Apache傳遞沿tomcat的頭?

+2

這真的值得優化嗎?每週只發送一次身體已經很好的優化了。身體是如此帶寬消耗? –

+0

您應該顯示響應/請求+響應代碼中的頭部,304響應(未修改)不會阻止使用新頭部,並且必須包含Date頭部。 – bestsss

+0

@JBNizet我相信他的問題是,如果資源被修改,瀏覽器現在會重新檢查每次訪問,因爲它沒有收到更新的「下一個星期一重試」。瀏覽器只看到「該文件已超過7天,我必須重試」。解決方法可能是每週強行發送一次,即強制每週一次有一個「新」版本,即使它實際上是相同的。 –

回答

5

只是一個Expires頭是不夠的。據RFC 2616部分13.3.4,服務器需要有兩個頭,Last-ModifiedETag迴應,做條件得到正確的:

換句話說,對於HTTP首選行爲/ 1.1原始服務器發送一個強大的實體標籤和一個Last-Modified值。

如果客戶端符合HTTP/1.1,則應發送If-Modified-Since。然後,服務器應該如下(從Roy Fielding的proposal to add conditional GET報價)迴應:

  • 如果資源是不可訪問(無論何種原因),那麼服務器應該返回4XX消息,就像現在這樣。
  • 如果資源不再存在,服務器應返回404 Not Found響應(即與現在相同)。
  • 如果資源是可訪問的,但其最後修改日期早於(小於)或等於傳遞日期,則服務器應返回304 Not Modified消息(不含主體)。
  • 如果資源是可訪問的,並且其最後修改日期晚於傳遞日期,則服務器應返回一個200 OK消息(即與現在一樣)與正文。

所以,我想你不需要像你描述的那樣配置Apache和/或Tomcat。您需要使您的應用程序符合HTTP/1.1。

+0

請參考RFC 2612的第10.3.5節。它說什麼是ETag和Date,可以包括Expires,Cache-control和/或Vary。 – maniek

+0

「首選行爲」並不意味着這是一項要求。您無需爲If-Modified-Since發送ETag標題以正常工作。 – RickNZ

+0

@RickNZ你說得對,是的。 '''ETag'''不是強制性的,但建議。更多的HTTP/1.1-ish,如果你願意的話。這也是爲什麼我說'需要'而不是'必須'。 – edwardw

0

解決此問題的一種方法是每週使用單獨的URI。規範url會重定向到本週的相應url,並指示瀏覽器將重定向緩存一週。此外,它們中包含日期的URL將指示瀏覽器永遠緩存。

典型URL:/路徑/到/資源


Status Code : 301 
Location : /path/to/resource/12-dec or /path/to/resource/19-dec 
Expires : Next Monday 

1周:/路徑/到/資源/ 12-DEC


Status code : 200 
Expires : Never 

第2周:/路徑/ to/resource/19-dec


Status code : 200 
Expires : Never 

當緩存在星期一過期時,您只需發送重定向響應。您要麼發送上週的網址,要麼發送這幾周,但您絕不會發送整個回覆正文。

用這種方法,你已經消除了條件獲取。您還使您的資源「不可修改 - 一次發佈」,並且您還獲得版本化資源。

即使http規範要求他們這樣做,唯一的警告 - 重定向不會被所有瀏覽器緩存。值得注意的是IE8及以下版本不會緩存。有關詳細信息,請撥打look at the column "cache browser redirects" in browserscope

0

Expires標頭基本上已被HTTP 1.1棄用;改爲使用Cache-Control: max-age

確保您包括Last-Modified

它是可選的,但您可能還想指定Cache-Control: must-revalidate,以確保中間代理不會傳遞可能過時的內容。

您無需設置ETag

實施例請求:

GET http://localhost/images/logo.png HTTP/1.1 
Accept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5 
Referer: http://localhost/default.aspx 
Accept-Language: en-US 
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
Accept-Encoding: gzip, deflate 
Host: localhost 
Connection: Keep-Alive 

該響應包括所請求的內容:10秒超時之前作出

HTTP/1.1 200 OK 
Cache-Control: max-age=10 
Content-Type: image/png 
Last-Modified: Sat, 21 Feb 2009 11:28:18 GMT 
Accept-Ranges: bytes 
Date: Sun, 18 Dec 2011 05:48:34 GMT 
Content-Length: 2245 

請求從高速緩存解決,沒有HTTP請求。超時後:

GET http://localhost/images/logo.png HTTP/1.1 
Accept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5 
Referer: http://localhost/default.aspx 
Accept-Language: en-US 
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
Accept-Encoding: gzip, deflate 
Connection: Keep-Alive 
If-Modified-Since: Sat, 21 Feb 2009 11:28:18 GMT 
Host: localhost 

的反應僅僅是標題,沒有內容:

HTTP/1.1 304 Not Modified 
Cache-Control: max-age=10 
Last-Modified: Sat, 21 Feb 2009 11:28:18 GMT 
Accept-Ranges: bytes 
Date: Sun, 18 Dec 2011 05:49:04 GMT 

後續請求再次從瀏覽器的緩存解決,直到指定緩存過期時間。

相關問題