配置静态资源的缓存时间(Httpd服务器)

-- TOC --

本文总结网站静态资源的缓存时间相关内容,为什么,以及如何在Httpd服务器上配置。

设置静态资源缓存的好处

网站的静态资源包括渲染页面的CSS文件,实现各种效果的JS文件,各种图片,甚至整个网页本身都可以是静态资源。

所谓缓存,是指缓存在客户端浏览器里面。这种缓存带来的好处是,当用户通过浏览器访问网站的多个页面的时候,相同的资源只需要请求一次。比如很多页面共用一个CSS文件,当用户在这些网页中切换的时候,不会重复请求这个相同的CSS文件。

这带来的好处有:

  1. 加快客户端页面的加载速度,因为要请求的资源已经缓存在本地了;
  2. 减轻服务器的访问压力,客户端不去请求已缓存的资源,请求数量减少了;
  3. 据说设置了缓存后,对搜索引擎也比较友好,是一项SEO内容。

缓存原理

This module controls the setting of the Expires HTTP header and the max-age directive of the Cache-Control HTTP header in server responses. The expiration date can set to be relative to either the time the source file was last modified, or to the time of the client access.

通过在Httpd服务器的Response报文中,设置Expires HTTP header和max-age,让客户端浏览器知道这个资源的缓存时间。

因此,实际上客户端浏览器是否真的严格按照缓存来执行,是浏览器自己的事情,服务器只是起到告知的作用。比如:如果我们开启浏览器的隐私模式,之前的缓存就会都失效。还有 Ctrl-F5 功能,强制刷新页面,所有的缓存都不会起作用。

两种缓存模式

Httpd服务器提供两种模式设置缓存:

  1. 按访问时间;(A)
  2. 按文件修改时间,mtime;(M)

按访问时间,即从这个资源被访问的时间开始计算缓存的时间,比如从访问时间往后一个星期。按文件修改时间,是以资源的mtime为起点计算,此时资源必须是磁盘上的文件,如果不是,这个资源就没有mtime,响应的HTTP response头也不会添加上去。

一般都使用按访问时间的缓存模式!

如何在Httpd服务器上配置

首先,开启mod_expires.so模块:

LoadModule expires_module modules/mod_expires.so

然后开始配置:

<IfModule mod_expires.c>
# enable expirations
ExpiresActive On
ExpiresDefault A2592000
ExpiresDefault "access plus 1 month"
ExpiresDefault "access plus 4 weeks"
ExpiresDefault "access plus 30 days"
</IfModule>

首先,要通过 ExpiresActive On 指令打开这个功能。

ExpiresDefault 指令设置默认的缓存时间, A2592000,A就是access,2592000是秒数。上面着4条default配置,表示的含义都一样,都是缓存一个月。注意default配置是对所有的资源有效,一般不会这样配置。

<IfModule mod_expires.c>
# enable expirations
ExpiresActive On
# expire GIF images after a month in the client's cache
ExpiresByType image/gif A2592000
# HTML documents are good for a week from the
# time they were changed
ExpiresByType text/html M604800
# css/js
ExpiresByType text/css "access plus 4 weeks"
ExpiresByType text/javascript "access plus 4 weeks"
</IfModule>

我们用 ExpiresByType 来按MIME类型配置缓存时间。注意 M604800,M表示Modification,即按mtime的方式配置,604800是秒数,表示7天时间。

看出来了吧,缓存配置可以精确到秒,虽然貌似意义不大。我们还可以通过一个可选的plus参数,以readable的方式实现精细化的配置:

ExpiresByType text/html "access plus 1 month 15 days 2 hours"
ExpiresByType image/gif "modification plus 5 hours 3 minutes 35 seconds"

我真的不知道缓存精确到秒的意义何在!但从软件设计角度看,总是需要一个最小的度量单位,这个单位就是秒。

本文链接:https://cs.pynote.net/net/httpd/202110035/

-- EOF --

-- MORE --