2013-10-04 26 views
0

根據http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.10,客戶端必須在POST,PUT或DELETE請求後使與URL關聯的高速緩存無效。如何使任意URL的緩存失效?

是否可以指示Web瀏覽器使任意URL的緩存無效,而無需發出HTTP請求?

例如:

  1. PUT /companies/Nintendo創建一個新公司名爲「任天堂」
  2. GET /companies列出了所有公司
  3. 每次我創建一個新的公司,我想失效與GET /companies相關的高速緩存。瀏覽器不會自動執行此操作,因爲它們在不同的URL上運行。

Cache-Control機制是否不適合這種情況?我應該使用no-cache以及ETag嗎?這種情況的最佳做法是什麼?

我知道我可以通過no-cache下次我GET /companies但這需要應用程序跟蹤URL失效,而不是將責任推到瀏覽器。意思是,我想在步驟1之後使URL無效,而不是必須堅持這些信息並在第2步中應用它。任何想法?

回答

-1

在您給出的「該短語」使實體無效的鏈接中,意味着緩存將從其存儲中刪除該實體的所有實例,或者將這些實例標記爲「無效」並且需要強制重新驗證然後才能將它們返回以響應隨後的請求。「現在問題是緩存在哪裏?我相信這篇文章談論的Cache是​​服務器緩存。

我曾在一個VC++項目工作,每當模型更改緩存更新。有一個編程邏輯實現涉及到實現這一點。您提到的文章正確地指出:「HTTP協議無法保證所有此類緩存條目都被標記爲無效」,HTTP協議無法自行使緩存無效。

在我們的項目示例中,我們使用了發佈訂閱機制。當A級對象被更新/插入時,它被髮布到公共汽車。控制器註冊以偵聽總線上的對象。假設控制器對對象A的變化感興趣,只要對象類型B被改變和發佈,它就不會被回調。當對象類型A確實被更改併發布時,控制器A偵聽器函數會使用對象A的最新更改來更新緩存。GET /公司的後續請求將從緩存中獲取最新的請求。現在,更改對象A和正在刷新最新更改的緩存之間存在時間差。爲了避免此時間間隙中發生錯誤,在對象A更改之前對象被標記爲髒。因此,這些時間之間的請求將等待髒標誌被清除。

還有一個瀏覽器緩存。我記得ETAGS是用來驗證這一點的。 ETAG是資源的校驗和。對於這個客戶應該保持舊的ETAG價值。如果資源的校驗和已經改變,則發送具有HTTP 200的新資源,否則發送HTTP 304(使用本地副本)。

[更新]

PUT /公司/任天堂

GET /公司

是兩個不同的資源。當PUT/companies/Nintendo請求被執行時,您的/ cache/company/Nintendo預期只會被更新,而不會/公司(我正在談論客戶端緩存)。假設您下次調用GET /companies/Nintendo,根據http頭返回響應。 GET /companies是一個全新的請求,因爲它指向不同的資源。

現在問題是什麼應該是http頭?它純粹是應用程序特定的。假設它是我不會緩存的股票報價。假設它是NEWS項目,我會緩存一段時間。您的參考鏈接http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html包含Cache http標題的所有詳細信息。只有沒有提到的東西是ETag的用法。 ETag可以擁有資源的校驗和。檢查http://en.wikipedia.org/wiki/HTTP_ETag並檢查https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers

+0

您的答案中的關鍵點似乎是文章中的引述:「HTTP協議無法保證所有此類緩存條目都被標記爲無效。」剩下的問題是什麼是正確的操作方法(根據REST)? – Gili

+0

您的第三點每當我創建一家新公司時,我想使與GET /公司關聯的緩存無效。我解釋瞭如何爲服務器緩存實現這一點。對於瀏覽器緩存檢查,您可能需要使用ETAGS。 – Satish

+0

這個問題從來沒有關於服務器端緩存(我鏈接到的文章是關於客戶端緩存)。這個問題已經提到可能使用'ETag',但還不清楚其他緩存頭應該與'ETag'一起返回。我在尋找最佳實踐的參考,而不僅僅是「這對我有用」的解決方案。 – Gili

0

不,在HTTP/1.1中,您可能只會響應對該資源的請求而使客戶端的資源緩存無效。它可能是迴應「PUT , POSTDELETE而不是GET(詳情請參閱RFC 7234, section 4.4)。

如果您有資源需要客戶確認他們有最新版本,那麼no-cache和實體標籤是理想的解決方案。

HTTP/2允許將緩存清除(Nine Things to Expect from HTTP/2'4. Cache Pushing')。