设置浏览器缓存
| |
2012/10/22 建站
在用户浏览网站的不同页面时,很多内容是重复的,比如相同的 javascript,css,背景图片等。如果我们能够建议甚至强制浏览器在本地缓存这些文件,将大大降低页面产生的流量,从而降低页面载入时间。

根据服务器端的响应 header,一个文件对浏览器而言,有几级不同的缓存状态。

  1. 服务器端告诉浏览器不要缓存此文件,每次都到服务器上更新文件。
  2. 服务器端没有给浏览器任何指示(此时我也不知道这时候浏览器将会怎么做),这种情况多为动态脚本(比如PHP)产生的文件。
  3. 在上次传输中,服务器给浏览器发送了 Last-Modified 或 Etag 数据,再次浏览时浏览器将提交这些数据到服务器,验证本地版本是否最新 的,如果为最新的则服务器返回 304 代码,告诉浏览器直接使用本地版本,否则下载新版本。一般来说,有且只有静态文件,服务器端才会给出这些数据。
  4. 服务器强制要求浏览器缓存文件,并设置了过期时间。在缓存未到期之前,浏览器将直接使用本地缓存文件,不会与服务器端产生任何通信。

我们要做的是尽量强制浏览器到第四种状态,特别是对于 javascript, css 和图片等变动较少的文件。

对于 PHP 产生的动态内容,只需要在内容输出之前输出强制缓存的 header 即可,比如下面的代码即要求浏览器缓存文件1个月:

  1. <?php
  2. header("Cache-Control: public");
  3. header("Pragma: cache");
  4.  
  5. $offset = 30*60*60*24; // cache 1 month
  6. $ExpStr = "Expires: ".gmdate("D, d M Y H:i:s", time() + $offset)." GMT";
  7. header($ExpStr);
  8. ?>

对于静态文件,一般的服务器都支持第3级缓存状态。要想达到第四级的缓存效果,要么像之前 GZIP 压缩那样,用 PHP 外包一层,然后用 PHP 处理。 要么需要服务器端的支持,APACHE 的一个模块 mod_expires 支持给文件添加 expires header。把下面的代码加入你的网站目录下的 .htaccess文件,如果你的服务器安装了 mod_expires 模块,则将自动生效,图片等强制缓存一个月,html 文档缓存10分钟。如果该模块没有安装,也不会出错。

  1. <IfModule mod_expires.c>
  2. ExpiresActive On
  3. ExpiresByType image/gif A2592000
  4. ExpiresByType image/jpeg A2592000
  5. ExpiresByType image/png A2592000
  6. ExpiresByType application/x-shockwave-flash A2592000
  7. ExpiresByType text/css A2592000
  8. ExpiresByType application/x-javascript A2592000
  9. ExpiresByType text/html A600
  10. </IfModule>
 

这里有 mod_expires 更详细的文档和教程。不过要说明的是,mod_expires在绝大多数服务器上都没安装,因为虽然这个模块包含在 Apache 的发行版里,但并不是默认安装模块。

10K
本文来源: 噜噜网 | 目前已有 18424 人围观此文,标签:

浮上来留个足迹吧,看帖不回会被鄙视de哦: