簡體   English   中英

緩存的圖片問題

[英]Cached image problem

是的,我的問題是我需要替換出現在站點每一頁上的圖像,這很好,問題是我希望每個用戶都可以看到新圖像,而不是舊圖像的緩存版本。 這變得特別困難,因為我無法進行任何代碼更改(要想使它可行,要在太多地方進行更改),因此我需要用相同名稱的新服務器替換服務器上的映像。 不僅如此,頁面也很沉重,所以我不想每次請求頁面時都強制整個頁面完全重新加載。

我認為最好的方法是在IIS中執行某些操作,以將新映像強加給尚未擁有該映像的任何人。 Last-Modified或Expires HTTP標頭是我的第一站,但我可以找到一種方法使它們適用於單個項目而不是整個頁面。

任何幫助/想法都太棒了!

謝謝,湯姆。

我遇到了同樣的問題,並找到了以下解決方案:

$randy = md5( uniqid (rand(), 1) );

然后使您的圖像像:

$profile_img = "<img src='$imageLocation2?$randy' border='0'/>";

echo $profile_img;

這會在jpg文件的末尾放置一個隨機字符串,例如?3984289040823,因此源代碼將如下所示:

<img src="example.jpg?3984289040823" />

現在,每次加載頁面時,瀏覽器都會認為這是一個新圖像並進行加載。

我相信唯一的方法就是使用HTTP標頭。

我看到兩個選擇:

  1. 將標頭添加到文件。 我對IIS不太了解,但是我認為他們有這樣的選擇。
  2. 用腳本(php或C#)替換圖像,在代碼中手動添加標題並發送圖像

IIS 應該根據文件本身來設置最后修改的標頭和/或etag,因此,如果仍在緩存,則瀏覽器的行為可能不正確,在這種情況下,您將希望設置No-Cache編譯指示。 參考: Microsoft KB參考HTTP1.1規范的14.9節

Elalfer的解決方案2可能會實現副產品No-Cache實用性。

HTTP標頭始終僅適用於一項。 對於在頁面本身上設置的內容,它們僅適用於頁面,而不適用於鏈接的資源。

野外的瀏覽器和HTTP緩存將已經緩存了該映像的副本。 沒有辦法強迫他們在不更改圖像URL的情況下重新加載圖像(您已聲明無法這樣做)。

如果這是您唯一一次更改此圖像,或者您希望這種更改很少發生,則只需更改該圖像,最終網絡將緩存新圖像。 Web服務器將通知檢查更新版本的瀏覽器時間戳已更改。

為了進行更永久的更改,您需要調查IIS如何為靜態文件設置標頭。 我懷疑它為所有文件統一設置了所有標頭,但是可能有一種方法可以覆蓋特定文件的標頭。 如果沒有,您應該能夠在傳遞內容之前將對該URL的請求包裝在設置標題的腳本中。 在這種情況下,您想要做的就是設置Expires或max-age標頭,以便瀏覽器知道將此項保留在緩存中的時間。 請注意,這些標頭僅適用於以后對此文件的請求。

將這些標題放在頁面本身中不會影響對該文件的請求。 添加緩存控制標頭時要小心,因為如果錯誤地過分緩存了錯誤的內容,則您的站點可能無法正常運行。 否則,您的帶寬可能會突然增加,因為應該緩存的內容沒有被緩存。

為了將來考慮,您應該可以在內容更改時更改靜態資源的路徑。 這使瀏覽器清楚地知道該文件是新文件,因為路徑中的URL不會包含任何內容。 例如:

www.yoursite.com/images/v1/logo.png

www.yoursite.com/images/v2/logo.png

一旦logo.png更改為v2。 然后,在引用了logo.png的頁面中,您有代碼可以自動在頁面中寫入正確的url。 這樣,文件的每個修訂版都具有唯一的名稱,因此不會與任何先前緩存的版本沖突。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM