网站图像caching与Apache
如何获得Apache上的静态内容(由浏览器caching)而不是{检查新鲜度(每个请求)}?
我正在Apachenetworking服务器上托pipe的网站上工作。 最近,我正在testing一些标题(内容types为不同types的内容),并看到了很多的图像条件请求。 例:
200 /index.php?page=1234&action=list 304 /favicon.ico 304 /img/logo.png 304 /img/arrow.png (etc.)
尽pipe图像文件是静态内容,并且被浏览器caching,但是每当用户打开链接到它们的页面时,它们被有条件地请求,并向其发送“304未修改”。 这是很好的(减less了数据传输),但是这意味着每次页面加载时都会有20多个请求(由于所有这些往返都会导致更长的页面加载时间,即使启用了Keep-Alive和stream水线)也是如此。
我该如何告诉浏览器保留现有的文件,而不是检查更新的版本?
编辑:mod_expires方法工作,甚至与favicon。
Apache中的Expires模块解决了这个问题 – 它需要在服务器configuration中加载,并在.htaccess
(或在服务器configuration中)中进行设置。
使用Expires标题时,资源仅在第一次被请求。 在到期date之前,后续请求从浏览器caching中完成。 在指定的时间到期并且需要资源之后,才再次请求(有条件地 – 对于不变的资源将返回304)。 在过期之前将其从caching中清除的唯一可靠方法是手动或通过强制刷新(通常是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™!
使用filesMatch
指令而不是ExpiresByType
,可以通过匹配subtype
(例如image/*
)将Content-Type
分组,而不是列出每个type/subtype
对,而不是subtype
(例如image/jpeg
, image/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>
根据这篇Google文章,我提出了不超过1年的期限( access plus 11 month
),并添加了Cache-Control "public"
来启用Firefox的HTTPScaching。
对于CSS和JS,Googlebuild议一周的到期时间。
<filesMatch "\.(css|js)$"> ExpiresActive On ExpiresDefault "access plus 1 week" Header append Cache-Control "public" </filesMatch>
如果你在你的静态图像的http响应中设置了Expires
标头,那么在第一次下载之前,你的服务器将不会被再次检查,直到指定的时间已经过去,例如,如果我从你的服务器上下载了一个文件,标题为
Expires: Fri, 1 Jan 2010 00:00:01 GMT
那么我的浏览器将不会再从服务器上查找它,直到2010年,除非我清除我的caching/强制刷新(在Windows上Ctrl + F5)。
有一个简单的介绍, 在这里设置这个,以及在维基百科其他可能有用的回应列表
关于favicon.ico,把它放在你的服务器文件根目录下,说/ 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将适用于所有的虚拟托pipe网站,因为你是别名。 用户访问您的网站后,任何进一步的访问将在浏览器caching副本上绘制一个月,而不是从networking上。
我无法得到
ExpiresByType image/ico "access plus 1 month"
一切工作。 也许它需要按上面的build议键入text / plain。 无论如何ExpiresDefault工作正常。