2011-06-28 128 views
2

我想刷新頁面,但想要使用緩存,並不知道如何做到這一點。有兩種情況:刷新頁面使用緩存

  • 如果我在地址欄點擊並按下回車鍵(或從其他地方訪問的頁面),它從緩存中重新加載頁面/圖像。 太棒了!

  • 如果我點擊刷新按鈕或使用Javascript來刷新頁面,它會再次抓住所有的圖像,並永遠佔用。 不太好!

我已經試過:top.location.reload(false);top.location.reload(true);(我從一個iFrame發送此),並沒有使用緩存。我正在避免使用location,因此它不會在瀏覽器歷史記錄中結束兩次。

問題:如何使用緩存圖像重新加載頁面?是否有不同的JavaScript功能或這是一個mod_expires問題?

感謝您提前提供任何幫助!

編輯:(從鉻信息:開發者工具)

  • 當瀏覽網頁,我得到「從緩存中」所有圖片
  • 當清爽的頁面,我得到「304 - 未修改」所有圖像(和它需要的下載每次)

編輯2:(從圖像,野生動物園頭:開發者工具)

Javascript:top.location.reload(false); (沒有緩存!)

Status Code:304 Not Modified 

Request Headers 
Cache-Control:max-age=0 
If-Modified-Since:Tue, 28 Jun 2011 07:13:17 GMT 
If-None-Match:"104684ae-a7d-66e41d40" 
Referer:http://getdirectus.com/dev/media.php 
User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1 

Response Headers 
Cache-Control:max-age=157680000 
Connection:Keep-Alive 
Date:Tue, 28 Jun 2011 16:56:50 GMT 
Etag:"104684ae-a7d-66e41d40" 
Expires:Sun, 26 Jun 2016 16:56:50 GMT 
Keep-Alive:timeout=5, max=94 
Server:Apache/2.0.54 

導航頁:(使用高速緩存)

Status Code:200 OK 

Response Headers** 
Accept-Ranges:bytes 
Cache-Control:max-age=157680000 
Connection:Keep-Alive 
Content-Length:2685 
Content-Type:image/jpeg 
Date:Tue, 28 Jun 2011 16:54:20 GMT 
Etag:"104684ae-a7d-66e41d40" 
Expires:Sun, 26 Jun 2016 16:54:20 GMT 
Keep-Alive:timeout=5, max=99 
Last-Modified:Tue, 28 Jun 2011 07:13:17 GMT 
Server:Apache/2.0.54 
+3

也許我沒有理解這一點,但如果你想保留緩存,「刷新」的意義何在? –

+0

它可以是a)服務器到期和/或b)客戶端到期(不是或小型緩存)不要忘記c)一些隨機值添加到URL,因爲你想保留圖片不在緩存中,但忘了它。下載螢火蟲,單擊NET標籤並查看標題 – mplungjan

+0

@Brad - 具體來說,它是用於媒體縮略圖頁面。在AJAXed iFrame中上傳新圖像後,我想刷新頁面......但是每次我都會從服務器上重新加載頁面上的所有圖像。從技術上講,它只能加載新上傳的圖像。 – RANGER

回答

5

documentationwindow.location.reload(false);表示它將從緩存中加載。如果這沒有發生,那麼你可能會看到一個瀏覽器錯誤。看看你是否可以在另一個瀏覽器中複製問題。

編輯(您的編輯):您看到該行爲,因爲您將來沒有設置過期標題。您將需要add an Expires header in Apache

+0

@SpliFF - 謝謝,我添加了一個htaccess文件,內容如下:'ExpiresActive On ExpiresByType image/jpg「修改加5年」(我的所有縮略圖都是jpgs),同樣的問題依然存在。刷新時仍然會顯示「304 - 未修改」。有任何想法嗎? – RANGER

+0

使用'access加5年'。使用'修改'需要不斷詢問服務器資源是否被修改(因此是304響應) – SpliFF

+0

@SpliFF - 我已將它切換到'access'並且問題依然存在,並且狀態返回相同。是否可以點擊刷新按鈕_強制瀏覽器不使用緩存? – RANGER

0

如果要啓用客戶端緩存,心中發送Expire頭,例如與mod_expires

+0

我在htaccess文件中設置了'expire'(請參閱帖子中的標題),問題依然存在。有任何想法嗎? – RANGER

0

使用this site,我只有得到綠色圖像與location.refresh(true);。用location.refresh();location.refresh(false);我得到了紅色的圖像。工作好,我猜。

+0

@Raven - 哈哈,我走了,看到紅色,然後點擊刷新,圖像被破壞了嗎?如果我移動 - 刷新或再次導航那裏我看它爲綠色......但它刷新所有刷新。 (我清除了我的緩存) – RANGER

0

有兩件獨立的事情要考慮在這裏:

1:請求...瀏覽器 - >服務器

2:響應...服務器 - >瀏覽器

當您刷新頁面,您可以不在身邊的瀏覽器做的網頁資源到服務器的請求得到。

你可以做的是確保服務器發送一個最小的響應。

實現此目的的最佳方法是在響應頭中使用etags。這樣瀏覽器會發送一個if-none-match請求到服務器,並得到一個304 Nothing changed迴應,假設沒有任何修改。

+0

我似乎在我的頭文件中有etags(請參閱後文中的編輯)和_am_在JavaScript刷新中獲取'304 Not Modified'。但是頁面仍然需要花費時間來加載所有圖片(而不是像導航到頁面時那樣從緩存中加載)。有什麼想法嗎? – RANGER

+0

圖像是否具有etags?您需要對所有不希望再次加載的資產擁有etags –

0

您的第二個請求是通過手動刷新頁面啓動的。當你這樣做時,瀏覽器發送一個額外的cache-control:max-age=0標題與請求。這是304(未修改)來自何處。

如果您在網站內部(使用鏈接)瀏覽,瀏覽器將繼續使用其緩存。

1
window.location.href = window.location.href; 

如果該位置包含#,務必設置href之前將其刪除。