2009-08-06 117 views
1

從外部源加載圖像時,是否可以使用JavaScript來動態更改收到的HTTP頭信息?我試圖控制圖像的緩存(Expires,Max-Age等)客戶端,因爲我沒有訪問服務器。使用JavaScript修改HTTP頭客戶端

+0

這與編程無關? (聽起來很奇怪,通常是相反的......) – Kobi 2009-08-06 04:53:24

+0

** @ Kobi:**我修改了這個問題(爲了清晰起見)。 – 2009-08-06 04:57:28

回答

1

我不認爲Javascript實際上可以做到這一點:圖像被瀏覽器請求,並由他來定義HTTP頭問題。

使用某些自定義標題的一種方法是使用某種Ajax請求,但不傳遞任何<img>標記;但你必須知道如何處理返回的數據......不要認爲這會有很大幫助。

如果你想通過瀏覽器保存在緩存您的圖片,您服務器發送的響應中的右頭(如Etag,和/或到期 - 見mod_expires,爲Apache,例如)

如果您想絕對確定瀏覽器將下載新圖片,而不是使用它在緩存中的版本,則應每次使用不同的URL。
這通常使用時間戳作爲URL的參數來完成;比如example.com/image.jpg?123456789 (123456789或多或少是當前的時間戳 - 顯然少於更多,但你會明白:每秒瀏覽器將看到URL已更改)

問題的編輯後


編輯:

由服務器生成的Expires頭部,並且是進來的響應報頭中的一個(它不是一個報頭中的客戶端的請求發送;參見List of HTTP headers )。

所以,你是絕對有來自客戶端沒有對其進行控制:這是必須配置做工作,這裏的服務器...


如果你想要更多的答案:你是什麼試圖做到完全?爲什麼?

+0

想要設置從外部源到客戶端使用客戶端技術而不是服務器(tomcat,apache)通過ajax的圖像/閃存獲取的更長過期max-age – cometta 2009-08-06 06:07:32

2

緩存指令在服務器的責任。你不能在客戶端操縱它們。

也許您可以選擇安裝代理服務器,例如如果你瞄準公司員工?

5

正如其他人所說的,不,它不可能在客戶端代碼中操作來自服務器的http頭和緩存指令。

什麼是可能的

你做什麼必須做的能力是確保你得到一個新的文件。這可以通過將唯一字符串附加到請求的URL作爲查詢字符串參數來完成。

例如如果你想確保你得到了每一個小時

<script type="text/javascript"> 

var d = new Date(); 
url += ("?" +d.getYear() + "_" + d.getDay() + "_" + d.getHours()); 

</script> 

這樣做是添加包含年,日,時的URL的值一個新的文件,所以這將是每個小時獨特的,從而確保新文件請求。 (未測試!)

很明顯,這可以做得更加通用,也可以進行微調,但希望你能明白。

什麼是不可能的

什麼,你不能做的是確保你不會從服務器檢索新版本。

+0

另一個注意事項:如果您不想緩存,可以使用'd。 getTime();'爲時間戳,它會附加一個數字,比如'1249547501178' – Kobi 2009-08-06 08:32:42