网站图像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/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> 

根据这篇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工作正常。