使浏览器缓存静态文件在nginx

本教程解释如何配置nginx设置Expires HTTP头和Cache-Control的max-age指令  统计信息的HTTP标头...

本教程介绍如何配置nginx将Expires HTTP头和静态文件(如图像,CSS和Javascript文件)的Cache-Control HTTP头的max-age指令设置为日期,以便这些文件将被访问者的浏览器缓存。 这可以节省带宽,并使您的网站显得更快(如果用户第二次访问您的网站,静态文件将从浏览器缓存中获取)。

我不会保证这将为您工作!

1初步说明

我假设你有一个工作的nginx设置,例如本教程所示: 在Ubuntu 12.04 LTS上安装带有PHP5(和PHP-FPM)和MySQL支持(LEMP)的Nginx

2配置nginx

Expires HTTP头可以通过可以放置在http {}server {}location {}位置{}块内的if语句的expires指令的帮助下进行设置。 通常,您将在静态文件的位置块中使用它,例如:

location ~*  \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}

在上面的例子中,所有.jpg.jpeg.png.gif.ico.css.js文件从浏览器访问时间获取日期365天的Expires标题。 因此,您应该确保位置{}块真的只包含可以被浏览器缓存的静态文件。

更改后重新加载nginx:

/etc/init.d/nginx reload

您可以使用以下时间设置与expires指令:

  • off使得ExpiresCache-Control头不会被修改。
  • 时期Expires标题设置为1970年1月1日00:00:01 GMT。
  • 最大值Expires标题设置为2037年12月31日23:59:59 GMT, Cache-Control max-age设置为10年。
  • 没有@前缀的时间表示相对于浏览器访问时间的到期时间。 可以指定负时间,将Cache-Control头设置为no-cache 。 示例: 到期10d;到期14w3d;
  • 使用@前缀的时间指定绝对时间到期时间,以HhHh:Mm格式写入,其中H的范围为0到24, M的范围为0至59.例如: expires @ 15:34 ;

您可以使用以下时间单位:

  • ms :毫秒
  • s :秒
  • m :分钟
  • h :小时
  • d :天
  • w :几周
  • M :月(30天)
  • y :年(365天)

示例:1小时30分钟,一小时三十分钟,1年6年,一年零六个月。

另请注意,如果您使用远未来的Expires标题,则只要组件更改,就必须更改组件的文件名。 因此,您的文件版本是个好主意。 例如,如果您有一个文件javascript.js并且要修改它,您应该添加一个版本号到修改的文件的文件名(例如javascript-1.1.js ),以便浏览器必须下载它。 如果您不更改文件名,浏览器将从缓存中加载(旧)文件。

您可以根据文件的修改日期( 请注意,这仅适用于存储在硬盘驱动器上的真实文件 ),而不是依赖浏览器访问时间的Expires标头(例如, 到期10d; )通过使用在时间之前的修改的关键字:

expires modified 10d;

3测试

要测试您的配置是否有效,您可以安装Firefox的Live HTTP Headers插件,并通过Firefox访问静态文件(例如图像)。 在Live HTTP Headers输出中,您现在应该看到一个Expires头和一个具有max-age伪指令的Cache-Control头( max-age包含一个值,以秒为单位,例如31536000将来是一年):

关于作者

Falko Timme是所有者 nginx Webhosting Timme Hosting (超快nginx网页托管)。 他是Howtoing(自2005年以来)的主要维护者, 也是ISPConfig的核心开发人员之一 (自2000年起)。 他还为O'Reilly的“Linux系统管理”一书作出了贡献。