如何让Apache上的静态内容{由浏览器缓存},而不是{检查新鲜度{每个请求}}?
我在Apache webserver上运行一个网站。最近,我测试了一些带有标题的东西(不同类型内容的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中。
4条答案
按热度按时间wnrlj8wa1#
Apache中的Expires模块解决了这个问题
它需要在服务器配置中加载,并在
.htaccess
(或服务器配置)中设置。使用Expires标头时,仅在第一次请求资源。在到期日期之前,将从浏览器缓存中满足后续请求。在指定时间到期且需要资源之后,才会再次请求该资源(有条件地-对于未改变的资源将返回304).在其过期之前将其该高速缓存中清除的唯一可靠方式是手动地,或者强制刷新(通常是Ctrl-F5)。(如果资源在此期间发生变化,这可能是一个问题,但静态映像不会经常变化。)
对于favicon.ico,需要做更多的工作(Apache通常不识别Windows图标文件,并将其作为默认的text/plain发送)。
瞧,它起作用了!
x8goxv8g2#
使用
filesMatch
指令,而不是ExpiresByType
,您可以通过匹配subtype
(例如image/*
)来对Content-Type
进行分组,而不是列出每个type/subtype
对,而不是subtype
(例如image/jpeg
、image/png
)。根据this Google article,我使过期时间不超过1年(
access plus 11 month
),并添加了Cache-Control "public"
以启用Firefox的HTTPS缓存。对于CSS和JS,Google建议有效期为1周。
smdnsysy3#
如果您在静态图像的http响应中设置了
Expires
标头,则在第一次下载之后,直到指定的时间过后,才会再次检查服务器是否有该图像,例如,如果我现在从服务器下载一个文件,其Expires
标头为那么我的浏览器在2010年之前不会再从你的服务器上查找它,除非我清除缓存/强制刷新(Windows上的Ctrl+F5)。
在wikipedia上有一个关于设置here的简单介绍,以及其他可能有用的响应列表
bhmjp9jg4#
关于favicon.ico,把它放在你的服务器文档根目录下,比如/var/www/html,然后把它添加到别名部分的/etc/httpd/conf/httpd.conf中:-
然后一个favicon.ico将适用于所有的虚拟主机网站,因为你是别名。在用户访问你的网站后,任何进一步的访问将提取一个月的浏览器缓存副本,而不是从网络。
我无法得到
才能工作。也许它需要像上面建议的那样输入text/plain。在任何情况下ExpiresDefault都可以工作。