2011-02-05 76 views
2

我有一個網站,它通過一個信息亭顯示給訪問者。人們可以與它互動。但是,由於該網站不在本地託管,並使用互聯網連接 - 頁面加載速度很慢。惰性HTTP緩存

我想實現某種懶惰的緩存機制,以便在人們瀏覽頁面時 - 頁面和頁面引用的資源被緩存,以便後續加載同一頁面是即時的。

我認爲使用HTML5離線緩存 - 但它要求我在清單文件中指定的所有資源,這是不是對我來說是可行的,因爲該網站是相當大的。

有沒有其他的方法來實現這個?也許使用HTTP緩存頭文件?我還需要一些方法來緩存在某個時候「推」的新變化給瀏覽器無效...

回答

2

通常的方法來處理這樣的問題,與HTTP緩存頭,再加上網址的智能建築爲您的網頁引用的資源。

的總體思路是這樣的:通過您的網頁加載(圖片,腳本,CSS文件等),每個資源應該有一個唯一的,版本URL。例如,不是加載/images/button.png,而是加載/images/button_v123.png,當您更改該文件時,其URL將更改爲/images/button_v124.png。通常情況下,這是通過對靜態文件URL進行URL重寫來處理的,例如,Web服務器知道/images/button_v124.png實際上應該從Web服務器的文件系統加載/images/button.png文件。創建版本號可以通過附加內部編號,使用文件內容的CRC或許多其他方式來完成。

然後,你需要確保的是,無論在網址父頁面構造,它們指的版本URL。這顯然需要用於構建所有URL的動態代碼,可以通過調整用於生成頁面的代碼或影響所有text/html請求的服務器級插件來完成。

然後,您將所有資源請求(圖像,腳本,CSS文件等)的標頭設置爲遠期日期(例如,從現在開始的10年)的標頭Expires。這有效地緩存他們永遠。這意味着每個頁面加載的所有請求都將始終從緩存中獲取;緩存失效從不發生,這是可以的,因爲當底層資源發生變化時,父頁面將使用新的URL來查找它。

最後,你需要弄清楚要如何緩存你的「父母」頁面。你如何做到這一點是一個判斷呼叫。您可以使用ETag/If-None-Match HTTP標頭每次檢查頁面的新版本,如果服務器報告它沒有更改,它將非常快速地從緩存中加載頁面。或者,在檢查服務器之前,您可以使用Expires(和/或Max-Age)在指定的時間段內從緩存中重新加載父頁。

如果你想要做更復雜的東西,你可以隨時把自定義代理服務器上的kiosk--在你不得不在高速緩存是如何完成的總,集中控制這種情況。

+0

嗨,你如何看待在資源中添加「版本查詢參數」的方法?因此,您將在應用程序中使用一個小的非緩存資源來返回應用程序的版本,併爲每個url添加版本(例如:/ images/button?version = v124)。這種方法的好處是在應用程序服務器端的可維護性。 – 2012-02-17 11:03:35