2010-06-11 52 views
6

我想弄清楚我是否可以讓瀏覽器緩存帶有簽名url的圖像。用不同的查詢字符串緩存圖像(S3簽名的url)

我想要的是爲每個請求(相同的圖像,但具有更新的簽名)生成一個新的簽名的url,但瀏覽器不會每次都重新下載它。

因此,假設緩存相關的標頭設置正確,並且除查詢字符串外的所有URL都相同,有什麼方法可以讓瀏覽器緩存它嗎?

的URL看起來是這樣的:

http://example.s3.amazonaws.com/magic.jpg?WSAccessKeyId=stuff&Signature=stuff&Expires=1276297463 
http://example.s3.amazonaws.com/magic.jpg?WSAccessKeyId=stuff&Signature=stuff&Expires=1276297500 

我們計劃設置電子標籤是一個的md5sum,所以將它至少弄清楚它是在這一點上相同的圖像?

我的另一種選擇是跟蹤上次發佈網址的時間,然後在舊的網址過期前稍微給出新網址,但我不想處理會話信息。

回答

4

瀏覽器將使用整個URL進行緩存,包括請求參數。所以如果你改變一個請求參數,它將會有效地成爲緩存中的一個新的「密鑰」,並且會一直下載該圖像的新副本。這是廣告服務領域的流行技術 - 您將一個隨機數(或當前時間戳)添加到URL的末尾作爲參數,以確保瀏覽器始終返回到服務器以發出新請求。

你可能會得到這個工作的唯一方法是如果你可以使URL是靜態的 - 即通過使用Apache重寫規則或某種類型的代理。

+0

你知道它是否至少會檢查電子標籤而不是再次下載它? – 2010-06-16 05:07:27

+0

ETag頭只在瀏覽器發現緩存中的文件(並且原始文件具有ETag值)時纔會發送到服務器。因此,如果在緩存中找不到它(如果URL已更改,則不會發現),請求中不會發送ETag值。 – 2010-06-16 05:35:55

+1

URL重寫規則會再次使S3簽名無效,因爲Web服務器會自動提供未過期的鏈接。然後,您還可以將S3中的文件標記爲「公開」。 (然後,不需要簽名來訪問文件) – Tarnschaf 2010-09-29 09:36:49

3

我一直有與S3簽名的URL完全相同的問題。我想出的唯一解決方案是讓網址在同一天過期。這並不理想,但至少它會提供緩存一段時間。

例如,在4月份簽署的所有網址我於5月10日設置了到期日。所有在6月份簽署的網址我將於7月10日到期。這意味着整個月的簽名網址將保持一致。

1

只是偶然發現了這個問題,並找到了解決方法。這裏是你需要做的:

  1. 存儲第一個url字符串(例如在localStorage例如);
  2. 當您收到的圖像網址下一次只檢查,如果他們的主網址都符合(str1.split('?')[0] === str2.split('?')[0]
  3. 如果他們這樣做,使用第一個作爲IMG src屬性。

希望它可以幫助別人。