Apache 如何配置 Expires 头优化浏览器缓存策略

文章导读
Apache 配置 Expires 头主要通过启用 mod_expires 模块并在 httpd.conf 或.htaccess 文件中设置 ExpiresActive On 及 ExpiresByType 指令实现。该方案适用于图片、CSS、JS 等静态资源缓存优化,但需避免对 HTML 等动态内容设置长期缓存以防内容不更新。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Apache 配置 Expires 头主要通过启用 mod_expires 模块并在 httpd.conf 或.htaccess 文件中设置 ExpiresActive On 及 ExpiresByType 指令实现。该方案适用于图片、CSS、JS 等静态资源缓存优化,但需避免对 HTML 等动态内容设置长期缓存以防内容不更新。

先说结论:Apache 通过 mod_expires 和 mod_headers 模块控制 HTTP 缓存响应头,能显著降低重复请求带来的服务器带宽消耗。

  • 适合:静态资源(图片、CSS、JS)长期缓存,动态内容(HTML、接口)短时效或禁用缓存。
  • 先准备:确认 Apache 已加载 mod_expires 和 mod_headers 模块,备份原有配置文件。
  • 验收:使用浏览器开发者工具或 curl 命令验证响应头中是否包含 Expires 和 Cache-Control 字段。

命令速用版

以下配置片段可直接添加到 httpd.conf 或虚拟主机配置中,用于开启缓存并设置不同类型资源的过期时间。

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresByType image/jpeg "access plus 1 year"
</IfModule>
<IfModule mod_headers.c>
    <FilesMatch "\.(js|css|jpg|jpeg|gif|png)$">
    Header set Cache-Control "public, max-age=31536000, immutable"
    </FilesMatch>
</IfModule>

为什么会这样

Expires 头指示资源过期的绝对时间,而 Cache-Control 使用 max-age 指定相对时间段,后者优先级更高且更灵活。

浏览器收到带有未来过期时间的响应头后,在有效期内再次请求相同资源时可以直接使用本地缓存,无需向服务器发送请求,从而减轻服务器压力。若同时设置 Cache-Control 和 Expires,Cache-Control 会覆盖 Expires 的设置。

分步处理

配置 Apache 缓存策略需按顺序启用模块、编写规则并重启服务,每一步都需检查语法是否正确。

Apache 如何配置 Expires 头优化浏览器缓存策略
  1. 启用模块:在 httpd.conf 中取消注释 LoadModule expires_module modules/mod_expires.so 和 LoadModule headers_module modules/mod_headers.so。
  2. 编写规则:在虚拟主机或目录配置中添加 ExpiresActive On 及具体的 ExpiresByType 规则,注意区分静态与动态资源。
  3. 重启服务:执行 apachectl restart 或 systemctl restart httpd 使配置生效,重启前建议运行 apachectl configtest 检查配置语法。

怎么验证是否生效

通过浏览器开发者工具的网络面板或 curl 命令查看响应头,确认是否存在 Expires 和 Cache-Control 字段且时间符合预期。

  • 浏览器验证:按 F12 打开开发者工具,刷新页面,查看静态资源请求的 Response Headers,状态码显示 200 from cache 表示缓存生效。
  • 命令验证:使用 curl -I [URL] 命令,检查输出中是否包含 Expires: [日期] 和 Cache-Control: max-age=[秒数]。
  • 注意刷新行为:强制刷新浏览器可能触发 304 状态码,直接在地址栏回车更易观察到 200 from cache。

常见坑

配置缓存时需特别注意动态内容的缓存策略,错误的长期缓存会导致用户无法看到更新后的内容。

  • 动态内容误缓存:HTML 页面和登录接口不应设置长期缓存,建议设为 no-cache 或短时效,避免用户获取旧数据。
  • immutable 指令使用:Cache-Control 中的 immutable 适用于带哈希指纹的文件名,普通文件慎用以防更新不生效。
  • 模块未加载:若配置后无效果,检查 Apache 错误日志确认 mod_expires 模块是否成功加载。

常见问题

Expires 和 Cache-Control 有什么区别?

Expires 设置绝对过期时间,Cache-Control 设置相对过期时间,后者优先级更高且支持更多指令。

HTML 文件需要设置 Expires 吗?

不建议对 HTML 文件设置长期缓存,因为 HTML 通常包含动态内容或引用资源版本变化,应设为 no-cache 或短时效。

配置后为什么还是 304 状态码?

强制刷新浏览器会触发条件请求导致 304,直接在地址栏回车访问通常能触发 200 from cache。

参考来源

  • Java 中 Apache 利用浏览器缓存减少服务器带宽消耗配置
  • Apache 开启 expires 响应头,优化缓存
  • 静态资源服务器 Apache 缓存策略优化
  • apache 设置 html 缓存,珍惜 SEO 用于优化页面缓存的 Apache 设置
  • apache 模块 mod_expires
  • 简单教学 apache 配置 Expire/Cache-Control 头
  • 利用 Apache 配置 http expires 值提高网站性能