問題描述

關於 CSS 和瀏覽器的快速問題。我試着搜索 SO,發現一些類似的帖子,但沒有確定。

我在我的 Web 項目中使用一個或兩個 CSS 文件。這些在我的網頁的 HEAD 中引用。一旦我打到我的一個頁面,CSS 是否被緩存,這樣每個請求都不是 re-downloaded?但願如此。 IE,Firefox 和 Safari 的處理方式有所不同嗎?如果瀏覽器關閉,在打開新的瀏覽器實例時,首次訪問時是否刷新 CSS?

最佳解決方案

您的文件可能會被緩存 – 但它取決於…

不同的瀏覽器具有稍微不同的行為 – 最明顯的是處理從服務器發出的模糊/有限的緩存頭。如果你發出一個清晰的信號,瀏覽器就會服從,幾乎所有的時間。

目前最大的差異是在不同的 Web 服務器和應用服務器的默認緩存配置中。

一些 (例如 Apache) 可能會使用 HTTP 標頭提供已知的靜態文件類型,鼓勵瀏覽器對其進行緩存,而其他服務器可能會在每個響應中發送 no-cache 命令 – 無論文件類型如何。

所以,首先,看一些優秀的 HTTP caching tutorials 在那裏。 HTTP Caching & Cache-Busting for Content Publishers 是我真正的開眼界:-)

下一步安裝和解決 FirebugLive HTTP Headers add-on,以找出您的服務器實際發送的頭。

然後閲讀您的 Web 服務器文檔,以瞭解如何調整他們完美 (或者説你的系統管理員為你做) 。

關於瀏覽器重新啓動時會發生什麼,這取決於瀏覽器和用户配置。

作為經驗法則,希望瀏覽器在每次重新啓動後更有可能與服務器簽入,以查看是否有任何更改 (請參閲 If-Last-ModifiedIf-None-Match) 。

如果正確配置服務器,則應該能夠返回一個 super-short 304 Not Modified(花費很少的帶寬),之後瀏覽器會正常使用緩存。

次佳解決方案

到你的問題的第一部分 – 是的,瀏覽器緩存 css 文件 (如果瀏覽器的配置沒有禁用) 。許多瀏覽器具有組合鍵以重新加載沒有緩存的頁面。如果您對 css 進行了更改,並希望用户立即查看它們,而不是等待下次瀏覽器重新加載文件而不進行緩存時,您可以通過向 URL 添加一些參數來更改 CSS irir 的服務方式,如下所示:

/style.css?modified=20012009

第三種解決方案

它確實取決於發送與 CSS 文件的 HTTP 標頭作為以前的答案狀態 – 只要你沒有附加任何緩存有效的東西到 href 。例如

<link href="/stylesheets/mycss.css?some_var_to_bust_cache=24312345" rel="stylesheet" type="text/css" />

默認情況下,一些框架 (例如 rails) 將它們放入。

但是,如果您收到類似 firebugfiddler 的內容,您可以在每個請求中看到您的瀏覽器正在下載什麼 – 這對於找出您的瀏覽器正在做什麼尤其有用,而不僅僅是它應該做什麼。

所有瀏覽器都應該以相同的方式遵循緩存標頭,除非配置為忽略它們 (但必定是異常)

第四種方案

可能值得注意的是,IE 不會使用 @import 方法緩存由其他 css 文件調用的 css 文件。所以,例如,如果你的 html 頁面鏈接到”master.css”,它通過 @import 拉入”reset.css”,那麼 reset.css 不會被 IE 緩存。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇