2011-02-17 63 views
1

是否有任何方式(服務器或客戶端)強制瀏覽器從服務器上拉取新版本的文件(鏡像)。有問題的圖像會被長時間緩存。我知道我可以附加一個隨機數字,例如圖像的URL,但在這種情況下這是不可接受的。我需要從刷新圖像,完全相同的 URL。刷新鏡像或清除緩存

我在做什麼:一個像用戶上傳視頻的YouTube門戶。每個視頻都有一個縮略圖,顯示在門戶網站的各個頁面上。用戶可以隨時更改縮略圖(他可以從三個縮略圖中選擇)。所以當發生這種情況時(新圖像會覆蓋原始圖像),我不想刷新視頻的縮略圖,以便所有者(我不關心其他用戶是否看到舊的縮略圖)會看到新的縮略圖顯示縮略圖的地方。

恐怕這是做不到的,但我在這裏問的只是要確定。

更新:我使用nginx的和PHP服務器端

+0

將Expires:header設置爲過去? – Satya 2011-02-17 11:32:04

+0

@Satya無法工作,因爲客戶端已經將圖像緩存起來,並且不會再次檢查它。 – 2011-02-17 11:33:52

回答

4

你可以使用你的縮略圖ETAGs。如果實際的縮略圖數據沒有改變(即仍然具有相同的散列),這將阻止傳輸實際的縮略圖數據。然而,你仍然會面對客戶HTTP請求來檢查ETAG是否已經改變(通常由HTTP 304來回答)。

但是結合一個相當短的新鮮度閾值(比如幾分鐘),你可以實現權衡如果你需要絕對新鮮的話,你可能必須堅持使用ETAG,如果你創建了一個聰明的散列函數,你可以在你的前端負載均衡器(或者至少在它附近)處理ETAG請求,因此,可能是相當便宜

編輯:。從我的其他評論添加替代

一替代方案可以是使用添加的請求參數在資源更改時強制重新獲取,如另一個答案中的建議。該模式的變體(許多Rails應用程序使用該變體)是將最後一次更改(或某種散列)的時間戳作爲參數附加到文件,該文件只在文件實際發生更改時纔會更改。類似這樣或上述方法之一,實際上是確保沒有不必要的緩存驗證請求的唯一方式,同時始終擁有最新的資源。

-1

添加在文件名的最後一個GET參數,如:

example.jpg?refresh=yesplease 

您還可以刷新該圖像每次訪問通過使用rand()參數。 在PHP中:

example.jpg?refresh=<?php echo rand(1,999); ?> 
+0

請再次重新閱讀該問題。我說我知道這個「竅門」,而且這是不可接受的。 – 2011-02-17 11:27:25