在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文件能及时加载新资源,避免样式或脚本失效。