设置Apache缓存策略

本文主要介绍如何通过Apache的mod_expires和mod_headers模块设置Apache缓存策略。

说明

免责声明:本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。

mod_expires模块设置

Apache可以通过配置文件的mod_expires模块控制HTTP协议的Expires和Cache-Control头部信息。mod_expires模块的主要作用是自动生成页面头部信息中的Expires标签和Cache-Control标签,从而降低客户端的访问频率和次数,达到减少不必要流量和增加访问速度的目的。

介绍说明

mod_expires是Apache众多模块中配置比较简单的模块,一共有以下三条指令。

  • ExpiresActive指令:打开或关闭产生Expires和Cache-Control标签的功能。

  • ExpiresByType指令:指定MIME类型文档的过期时间,例如text/html文档。

  • ExpiresDefault指令:所有文档的默认过期时间。

过期时间的写法如下。

  • access plus 1 month

  • access plus 4 weeks

  • now plus 30 days

  • modification plus 5 hours 3 minutes

  • A2592000

  • M604800

说明
  • access plus 1 month、access plus 4 weeks、now plus 30 days和A2592000写法的意义相同,指过期时间是从访问时开始计算。

  • modification plus 5 hours 3 minutes和M604800意义相同,指过期时间是以被访问文件的最后修改时间开始计算。

  • M604800只对静态文件起作用,脚本生成的动态页面不起作用。

配置步骤

  1. 启用mod_expires模块。在Apache配置文件(通常是httpd.conf.htaccess)中,添加以下指令以启用mod_expires功能:

    ExpiresActive On
  2. 设置默认过期时间。使用ExpiresDefault指令为所有文档设置一个默认的过期时间。例如,设置6个月后过期:

    ExpiresDefault "access plus 6 months"
  3. 按MIME类型设置过期时间。对于特定类型的资源,可以使用ExpiresByType指令分别设置不同的缓存时间。例如:

    ExpiresByType image/* "access plus 10 years"
    ExpiresByType text/* "access plus 10 years"
    ExpiresByType application/* "access plus 30 minutes"
  4. 禁用特定类型资源的缓存。若要禁止缓存特定类型资源,如将图片设置为不缓存,可将max-age设为0秒:

    ExpiresByType image/* A0
  5. 使用mod_headers模块设置Cache-Control头部。mod_headers模块允许你自定义HTTP头部信息,包括Cache-Control。例如,你可以设置让浏览器始终验证缓存内容:

    Header set Cache-Control "no-cache, must-revalidate"

请确保在修改配置文件后重启Apache服务以使更改生效。以上步骤是基于Apache服务器通过mod_expires和mod_headers模块来设置缓存策略的基本方法。

mod_headers模块设置

mod_headers模块配置示例如下所示,详细介绍请参考Apache官方网站

# YEAR
Header set Cache-Control "max-age=2592000″
# WEEK
Header set Cache-Control "max-age=604800″
# NEVER CACHE
Header set Expires "Thu, 01 Dec 2003 16:00:00 GMT"
Header set Cache-Control "no-store, no-cache, must-revalidate"
Header set Pragma "no-cache"

重启生效

修改配置后,请确保重启Apache服务使更改生效。使用也以下命令重启Apache服务:

# 重新加载Apache配置(推荐)
sudo systemctl reload apache2

# 或者重启Apache服务
sudo systemctl restart apache2

或者对于不使用systemctl的系统:

# 重新加载Apache配置(推荐)
sudo service apache2 reload

# 或者重启Apache服务
sudo service apache2 restart