菜鸟科技网

Apache如何设置静态资源缓存时间?

在Apache服务器中设置静态内容的缓存时间是通过配置HTTP响应头中的Cache-Control、Expires等字段来实现的,这样可以有效减少重复请求对服务器的压力,提升用户访问速度,以下是详细的配置方法和注意事项。

Apache如何设置静态资源缓存时间?-图1
(图片来源网络,侵删)

理解缓存相关的HTTP头缓存主要涉及以下几个HTTP响应头:

  1. Cache-Control:控制缓存行为,如max-age(缓存时间单位为秒)、public(可被任何缓存缓存)、private(仅客户端缓存)等。
  2. Expires:指定缓存过期时间,是一个具体的GMT时间格式。
  3. Last-Modified:资源最后修改时间,客户端可通过If-Modified-Since头进行条件请求。
  4. ETag:资源的唯一标识符,客户端可通过If-None-Match头进行验证。

基于文件扩展名的缓存配置

通过Apache的mod_headers模块,可以为特定扩展名的文件设置缓存时间,为图片、CSS、JS等静态文件设置缓存:

<IfModule mod_headers.c>
    # 图片缓存1年
    <FilesMatch "\.(jpg|jpeg|png|gif|ico)$">
        Header set Cache-Control "max-age=31536000, public"
    </FilesMatch>
    # CSS和JS缓存1年
    <FilesMatch "\.(css|js)$">
        Header set Cache-Control "max-age=31536000, public"
    </FilesMatch>
    # 字体文件缓存1年
    <FilesMatch "\.(woff|woff2|ttf|eot)$">
        Header set Cache-Control "max-age=31536000, public"
    </FilesMatch>
    # HTML文件不缓存或短时间缓存
    <FilesMatch "\.html$">
        Header set Cache-Control "max-age=0, private, no-store, no-cache, must-revalidate"
    </FilesMatch>
</IfModule>

说明:

  • max-age=31536000表示缓存1年(365天×24小时×3600秒)。
  • public表示代理服务器和浏览器均可缓存;private仅浏览器缓存。
  • HTML文件通常设置为不缓存或极短时间缓存,以确保内容实时性。

基于目录的缓存配置

若需要对某个目录下的所有文件统一设置缓存,可以使用<Directory>指令:

<Directory "/var/www/static">
    Header set Cache-Control "max-age=2592000, public"
</Directory>

上述配置将/var/www/static目录下的所有文件缓存30天(2592000秒)。

Apache如何设置静态资源缓存时间?-图2
(图片来源网络,侵删)

使用.htaccess文件配置

若无法修改主配置文件,可在网站根目录下的.htaccess中添加:

<IfModule mod_headers.c>
    <FilesMatch "\.(css|js|png|jpg|jpeg|gif|ico|svg)$">
        Header set Cache-Control "max-age=31536000, public"
    </FilesMatch>
</IfModule>

注意:确保.htaccess中允许使用mod_headers模块(通过AllowOverride OptionsAllowOverride All指令)。

结合Expires模块设置绝对过期时间

mod_expires模块可通过ExpiresActiveExpiresByType指令设置更灵活的缓存策略:

<IfModule mod_expires.c>
    ExpiresActive On
    # 默认缓存期为1天
    ExpiresDefault "access plus 1 day"
    # 按文件类型设置缓存期
    ExpiresByType text/css "access plus 1 year"
    ExpiresByType application/javascript "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/gif "access plus 1 year"
    ExpiresByType image/ico "access plus 1 year"
    ExpiresByType image/x-icon "access plus 1 year"
    # HTML文件不缓存
    ExpiresByType text/html "access plus 0 seconds"
</IfModule>

ExpiresByType支持的格式:

Apache如何设置静态资源缓存时间?-图3
(图片来源网络,侵删)
  • access plus:从访问时间开始计算。
  • modification plus:从文件修改时间开始计算。
  • 时间单位:seconds(秒)、minutes(分)、hours(小时)、days(天)、weeks(周)、months(月)、years(年)。

缓存配置的验证与测试

  1. 使用浏览器开发者工具:在Network选项卡中查看静态资源的Response Headers,确认Cache-ControlExpires是否生效。
  2. 使用命令行工具:通过curl -I [URL]命令查看HTTP响应头,
    curl -I https://example.com/static/style.css

    返回结果应包含类似Cache-Control: max-age=31536000, public的字段。

注意事项

  1. 缓存:对于动态生成的页面(如PHP、JSP),不建议长期缓存,可通过nocacheprivate限制。
  2. 版本控制:若静态文件内容更新,需修改文件名(如style.v2.css)或通过查询参数(如?v=2)强制刷新缓存。
  3. CDN配合:若使用CDN服务,需确保CDN节点与源站缓存策略一致,避免缓存不一致问题。

静态文件缓存配置示例表

文件类型 缓存时间 Cache-Control指令 说明
CSS/JS 1年 max-age=31536000, public 长期缓存,减少请求
图片(png/jpg) 1年 max-age=31536000, public 长期缓存,提升加载速度
字体文件 1年 max-age=31536000, public 长期缓存,避免重复下载
HTML 0秒 no-cache, no-store 禁用缓存,确保内容实时
API响应(JSON) 1小时 max-age=3600, private 仅浏览器缓存,1小时后失效

相关问答FAQs

问题1:修改缓存配置后,客户端如何立即生效?
答:若客户端已缓存资源,需强制刷新(Ctrl+F5或Cmd+Shift+R)或清除浏览器缓存,对于生产环境,可通过修改文件名(如app.min.js?v=2)或更新文件哈希值(如app.a1b2c3d4.js)让客户端请求新资源。

问题2:为什么HTML文件通常不设置长期缓存?
答:HTML文件通常包含动态内容(如用户信息、实时数据),长期缓存可能导致用户看到旧版本,HTML中的资源引用(如CSS/JS路径)若变更,未缓存的HTML文件能及时加载新资源,避免样式或脚本失效。

分享:
扫描分享到社交APP
上一篇
下一篇