如何使Apache上的静态内容被浏览器缓存,而不是在每次请求时检查其新鲜度?

nhn9ugyo  于 2022-12-30  发布在  Apache
关注(0)|答案(4)|浏览(111)

如何让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中。

wnrlj8wa

wnrlj8wa1#

Apache中的Expires模块解决了这个问题

a2enmod expires

它需要在服务器配置中加载,并在.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图标文件,并将其作为默认的text/plain发送)。

# 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"

瞧,它起作用了!

x8goxv8g

x8goxv8g2#

使用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>

根据this Google article,我使过期时间不超过1年(access plus 11 month),并添加了Cache-Control "public"以启用Firefox的HTTPS缓存。
对于CSS和JS,Google建议有效期为1周。

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

smdnsysy3#

如果您在静态图像的http响应中设置了Expires标头,则在第一次下载之后,直到指定的时间过后,才会再次检查服务器是否有该图像,例如,如果我现在从服务器下载一个文件,其Expires标头为

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

那么我的浏览器在2010年之前不会再从你的服务器上查找它,除非我清除缓存/强制刷新(Windows上的Ctrl+F5)。
在wikipedia上有一个关于设置here的简单介绍,以及其他可能有用的响应列表

bhmjp9jg

bhmjp9jg4#

关于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将适用于所有的虚拟主机网站,因为你是别名。在用户访问你的网站后,任何进一步的访问将提取一个月的浏览器缓存副本,而不是从网络。
我无法得到

ExpiresByType image/ico "access plus 1 month"

才能工作。也许它需要像上面建议的那样输入text/plain。在任何情况下ExpiresDefault都可以工作。

相关问题