2010-02-03 48 views
2

好吧,我很困惑。我試圖從我的服務器發回魔術標題,這將阻止客戶端再次點擊服務器,直到資源過時。防止HTTP客戶端擊中具有緩存的服務器(iphone)

我瞭解ETag或Last-Modified如何工作(驗證) - 客戶端總是仍然會打到服務器,並且服務器需要根據當前值驗證日期或etag以知道是否打擾提供新服務。

緩存控制和過期,但是,我不認爲我理解。我設置如下:

Cache-Control: max-age=86400, must-revalidate 

不管我做什麼,我的客戶(我的瀏覽器,捲曲,NSURLConnection的)總是再打服務器上的第二個請求。這是客戶端嗎?我應該發回什麼標題讓客戶端在特定時間段內使用它的私有緩存?

回答

2

正如Nathan在他的回答中所暗示的,客戶可以使用If-Modified-Since標題發出後續請求,以確定其緩存是否陳舊。如果客戶端收到304 Not Modified響應,它會將內容提供給本地緩存。

根據RFC 2616(HTTP 1.1規範),在Cache-control標頭內存在must-revalidate強制客戶端在服務於緩存之前重新檢查其與發起服務器的緩存狀態。

+0

第一段 - 如果客戶端收到304未修改,它是否會避免打一段時間的服務器? 第二 - 這並不符合我讀過的內容。 「必須重新驗證」意味着客戶無論如何都必須遵循「您的規則」。 – 2010-02-03 23:22:56

+0

噢,是的 - '必須重新驗證'不是你想要的。 – Nathan 2010-02-03 23:23:32

1

服務器需要檢查If-Modified-Since標題並返回304 not modified標題,如果它希望瀏覽器保持緩存。

+0

我理解的ETag如何工作。我想讓客戶端避免檢查服務器。顯然,驗證並不能幫助我做到這一點。也許我完全誤解了其他類型的? – 2010-02-03 23:16:05

+0

嗯。大約一年前我做了這件事,讓我查看細節。 – Nathan 2010-02-03 23:18:34

+0

我的PHP代碼中的相關行告訴瀏覽器不要再回來24小時: '$ this-> getResponse() - > setHttpHeader(「Cache-Control」,「max-age =」。(60 * 60 * 24),true);' – Nathan 2010-02-03 23:21:42

相關問題