使浏览器使用mod_expires缓存静态文件在Apache2(Debian Squeeze)
本教程将介绍如何配置Apache2以将日期
中的静态文件(如图像,CSS和Javascript文件)的Cache-Control
HTTP头的Expires
HTTP头和max-age
指令设置为日期,以便这些文件将被访问者的浏览器缓存。 这可以节省带宽,并使您的网站显得更快(如果用户第二次访问您的网站,静态文件将从浏览器缓存中获取)。 本教程是为Debian Squeeze编写的。
我不会保证这将为您工作!
1初步说明
我假设你的Debian Squeeze服务器上有一个工作的Apache设置,例如本教程所示: 在Debian Squeeze(LAMP)上安装Apache2与PHP5和MySQL支持
2启用mod_expires
可以启用mod_expires,如下所示:
a2enmod expires
之后重新启动Apache:
/etc/init.d/apache2 restart
3配置mod_expires
mod_expires配置可以放置在整个Apache服务器配置中,位于虚拟主机容器内,位于<Directory>
指令内或.htaccess
文件中。
在这个例子中,我将把它放在Apache的默认vhost中,它在Debian Squeeze中的/ etc / apache2 / sites-available / default中
配置:
vi /etc/apache2/sites-available/default
如果您有多个文件类型在访问后的同一时间过期(假定在一周内),则可以使用FilesMatch
和ExpiresDefault
伪指令的组合,例如:
[...] <IfModule mod_expires.c> <FilesMatch "\.(jpe?g|png|gif|js|css)$"> ExpiresActive On ExpiresDefault "access plus 1 week" </FilesMatch> </IfModule> [...] |
这将告诉浏览器将.jpg,.jpeg,.png,.gif,.js和.css文件缓存一周。
更改后重新启动Apache:
/etc/init.d/apache2 restart
您也可以使用ExpiresByType
指令,并为每个文件类型分别设置Expires
头(加上Cache-Control
HTTP头的max-age
指令),而不是使用FilesMatch
和ExpiresDefault伪
指令,例如:
[...] <IfModule mod_expires.c> ExpiresActive on ExpiresByType image/jpg "access plus 60 days" ExpiresByType image/png "access plus 60 days" ExpiresByType image/gif "access plus 60 days" ExpiresByType image/jpeg "access plus 60 days" ExpiresByType text/css "access plus 1 days" ExpiresByType image/x-icon "access plus 1 month" ExpiresByType application/pdf "access plus 1 month" ExpiresByType audio/x-wav "access plus 1 month" ExpiresByType audio/mpeg "access plus 1 month" ExpiresByType video/mpeg "access plus 1 month" ExpiresByType video/mp4 "access plus 1 month" ExpiresByType video/quicktime "access plus 1 month" ExpiresByType video/x-ms-wmv "access plus 1 month" ExpiresByType application/x-shockwave-flash "access 1 month" ExpiresByType text/javascript "access plus 1 week" ExpiresByType application/x-javascript "access plus 1 week" ExpiresByType application/javascript "access plus 1 week" </IfModule> [...] |
您可能已经注意到,我为JavaScript文件设置了三个ExpiresByType
伪指令 - 这是因为每个服务器上的Javascript文件可能有不同的文件类型。 如果您只设置了一个文本/ javascript指令
,但服务器将该Javascript文件识别为应用程序/ javascript
,则不会被您的配置覆盖,并且不会设置缓存头。
您可以在配置中使用以下时间单位:
- 年份
- 几个月
- 几周
- 天
- 小时
- 分钟
- 秒
请注意,Apache以单数和复数形式接受这些时间单位,因此您可以使用日
, 周
, 周
等。
可以组合多个时间单位,例如:
ExpiresByType text/html "access plus 1 month 15 days 2 hours"
另请注意,如果您使用远未来的Expires
标题,则只要组件更改,就必须更改组件的文件名。 因此,您的文件版本是个好主意。 例如,如果您有一个文件javascript.js
并且要修改它,您应该添加一个版本号到修改的文件的文件名(例如javascript-1.1.js
),以便浏览器必须下载它。 如果您不更改文件名,浏览器将从缓存中加载(旧)文件。
而不是将Expires
标题放在浏览器的访问时间(例如ExpiresByType image / jpg“
访问 加60天”
)中,您还可以将其设置在文件的修改日期( 请注意,这仅适用于真实文件存储在硬盘驱动器上! )通过使用修改
关键字而不是访问权限
:
ExpiresByType image/gif "modification plus 7 days"
4测试
要测试您的配置是否有效,您可以安装Firefox的Live HTTP Headers插件,并通过Firefox访问静态文件(例如图像)。 在Live HTTP Headers输出中,您现在应该看到一个Expires
头和一个带有max-age
指令的Cache-Control
头( max-age
包含一个值,以秒为单位,例如604800是将来的一周):
5链接
- Apache2 mod_expires: http : //httpd.apache.org/docs/2.0/mod/mod_expires.html
- Firefox的Live HTTP标头插件: https : //addons.mozilla.org/en-us/firefox/addon/live-http-headers/
- Debian: http : //www.debian.org/