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

理解缓存相关的HTTP头缓存主要涉及以下几个HTTP响应头:
- Cache-Control:控制缓存行为,如max-age(缓存时间单位为秒)、public(可被任何缓存缓存)、private(仅客户端缓存)等。
- Expires:指定缓存过期时间,是一个具体的GMT时间格式。
- Last-Modified:资源最后修改时间,客户端可通过If-Modified-Since头进行条件请求。
- 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秒)。

使用.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 Options或AllowOverride All指令)。
结合Expires模块设置绝对过期时间
mod_expires模块可通过ExpiresActive和ExpiresByType指令设置更灵活的缓存策略:
<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支持的格式:

access plus:从访问时间开始计算。modification plus:从文件修改时间开始计算。- 时间单位:
seconds(秒)、minutes(分)、hours(小时)、days(天)、weeks(周)、months(月)、years(年)。
缓存配置的验证与测试
- 使用浏览器开发者工具:在Network选项卡中查看静态资源的Response Headers,确认
Cache-Control和Expires是否生效。 - 使用命令行工具:通过
curl -I [URL]命令查看HTTP响应头,curl -I https://example.com/static/style.css
返回结果应包含类似
Cache-Control: max-age=31536000, public的字段。
注意事项
- 缓存:对于动态生成的页面(如PHP、JSP),不建议长期缓存,可通过
nocache或private限制。 - 版本控制:若静态文件内容更新,需修改文件名(如
style.v2.css)或通过查询参数(如?v=2)强制刷新缓存。 - 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文件能及时加载新资源,避免样式或脚本失效。
