2009-01-15 87 views
40

如何獲得Apache上的靜態內容(由瀏覽器緩存)而不是{檢查新鮮度(每次請求)}?使用Apache緩存網站圖像

我正在Apache網絡服務器上託管的網站上工作。最近,我正在測試一些標題(Content-Type適用於不同類型的內容),並看到了很多對圖像的條件請求。例如:

200 /index.php?page=1234&action=list 
304 /favicon.ico 
304 /img/logo.png 
304 /img/arrow.png 
(etc.) 

儘管圖像文件是靜態的內容和瀏覽器緩存,每一個用戶打開鏈接到他們的網頁的時候,他們正在有條件地要求向他們發送「304未修改」。這是好的(減少數據傳輸),但這意味着每次頁面加載時請求多於20次(由於所有這些往返都會導致更長的頁面加載時間,即使啓用了Keep-Alive和流水線)。

如何告訴瀏覽器保留現有文件而不檢查更新版本?

編輯: mod_expires方法工作,即使與favicon。

回答

52

Expires Apache中的模塊解決了這個問題 - 它需要在服務器配置中加載,並且設置在.htaccess(或在服務器配置中)。

使用Expires標頭,資源僅在第一次請求。在到期日期之前,後續請求將從瀏覽器緩存中完成。在指定的時間到期並且需要資源之後,只有在它被再次請求時(有條件地 - 將針對未更改的資源返回304)。在緩存過期之前將其從緩存中清除的唯一可靠方法是手動或通過強制刷新(通常爲Ctrl-F5)。 (這可能是一個問題,如果該資源在此期間的變化,但靜圖像不經常更改。)

# enable the directives - assuming they're not enabled globally 
ExpiresActive on 

# send an Expires: header for each of these mimetypes (as defined by server) 
ExpiresByType image/png "access plus 1 month" 
ExpiresByType image/gif "access plus 1 month" 
ExpiresByType image/jpeg "access plus 1 month" 

# css may change a bit sometimes, so define shorter expiration 
ExpiresByType text/css "access plus 1 days" 

對於favicon.ico的,多做一些工作需要(Apache的一般不會識別Windows圖標文件,並將其作爲默認文本/平原發送)。

# special MIME type for icons - see http://www.iana.org/assignments/media-types/image/vnd.microsoft.icon 
AddType image/vnd.microsoft.icon .ico 
# now we have icon MIME type, we can use it 
# my favicon doesn't change much 
ExpiresByType image/vnd.microsoft.icon "access plus 3 months" 

瞧,It Works™!

+1

我已經指定了我的圖標,使其具有MIME類型「image/x-icon」 - 我似乎無法讓Apache設置Expires標題。任何想法爲什麼這是?我需要使用圖像/ vnd.microsoft.icon? – Tom 2010-02-18 18:02:18

+1

@Tom:「用於.ICO文件的官方IANA註冊MIME類型是image/vnd.microsoft.icon。」 (維基百科)所以,你不需要使用它,但它是正確的MIME類型 - 你會發送JPEG圖像而不是標準的「image/jpeg」的「image/x-jpg」?是否有技術原因,您不想返回正確的MIME類型? – Piskvor 2010-02-19 12:30:47

+1

@Tom:對於第一個問題,只要知道它,服務器就不應該關心MIME類型。此MIME類型的* ExpiresByType之前是否有AddType *? – Piskvor 2010-02-19 12:37:51

3

如果您在您的靜態圖像的http響應中設置了Expires標頭,則在首次下載之前,您的服務器將不會再次檢查該圖像,直到指定的時間已過,例如,如果我從你的服務器下載文件,現在給它Expires頭爲

Expires: Fri, 1 Jan 2010 00:00:01 GMT 

然後我的瀏覽器不會看它從你的服務器再次,直到2010年,除非我清空緩存/盡了一份力刷新(按Ctrl在Windows上+ F5)。

有一個簡單的介紹,設置此here,以及關於在的favicon.ico wikipedia

2

的其他可能有用的反應了一個列表,把它放在你的服務器的根目錄比如/ var/www/html等,並添加這在別名部分/etc/httpd/conf/httpd.conf中: -

Alias /favicon.ico "/var/www/html/favicon.ico" 
<Directory "/var/www/html"> 
    <Files favicon.ico> 
     ExpiresActive On 
     ExpiresDefault "access plus 1 month" 
    </Files> 
</Directory> 

話單的favicon.ico將所有虛擬主機的網站工作,因爲你是走樣了。用戶訪問您的網站後,任何進一步的訪問都將在瀏覽器緩存副本上繪製一個月,而不是從網絡上繪製。

我不能讓

ExpiresByType image/ico "access plus 1 month" 

在所有的工作。也許它需要按照上面的建議輸入text/plain。在任何情況下,ExpiresDefault都可以正常工作。

22

隨着filesMatch指令,而不是ExpiresByType,可以通過匹配subtype(例如image/*)基團Content-Type,而不是列出每個type/subtype對,不subtype(例如image/jpegimage/png)。

#Set caching on image files for 11 months 
<filesMatch "\.(ico|gif|jpg|png)$"> 
    ExpiresActive On 
    ExpiresDefault "access plus 11 month" 
    Header append Cache-Control "public" 
</filesMatch> 

Acoording到this Google article我做到期不超過1年(access plus 11 month)長,並添加Cache-Control "public"啓用HTTPS的Firefox緩存。

對於CSS和JS,Google建議使用期限爲1周。

<filesMatch "\.(css|js)$"> 
    ExpiresActive On 
    ExpiresDefault "access plus 1 week" 
    Header append Cache-Control "public" 
</filesMatch>