如果这些模块不可用,你需要联系管理员,重新编译并包含这些模块。这些模块有时候通过配置文件中把注释掉的配置启用,或者在编译的时候增加-enable -module=expires和-enable-module=headers选项(在apache 1.3和以上版本)。 参考Apache发布版中的INSTALL文件;

  Apache一旦启用了相应的模块,你可以在.htaccess文件或者在服务器的access.conf文件中通过mod_expires设置副本什 么时候过期。你可设置过期从访问时间或文件修改时间开始计算,并且应用到某种文件类型上或缺省设置,参考模块的文档获得更多信息,或者遇到问题的时候向你身边的apache专家讨教。

  应用Cache-Control头信息,你需要使用mod_headers,它将允许你设置任意的HTTP头信息,参考mod_headers的文档可以获得更多资料;

  这里有个例子说明如何使用头信息:

  .htaccess文件允许web发布者使用命令只在配置文件中用到的命令。他影响到所在目录及其子目录;问一下你的服务器管理员确认这个功能是否启用了。

  ### 启用 mod_expires

  ExpiresActive On

  ### 设置 .gif 在被访问过后1个月过期。

  ExpiresByType image/gif A2592000

  ### 其他文件设置为后修改时间1天后过期

  ### (用了另外的语法)

  ExpiresDefault "modification plus 1 day"

  ### 在index.html文件应用 Cache-Control头属性

  Header append Cache-Control "public, must-revalidate"

  注意: 在适当情况下mod_expires会自动计算并插入Cache-Control:max-age 头信息

  Apache 2.0的配置和1.3类似,更多信息可以参考2.0的mod_expires和mod_headers文档;

  Microsoft IIS服务器

  Microsoft的IIS可以非常容易的设置头信息,注意:这只针对IIS 4.0服务器,并且只能在NT服务器上运行。

  为网站的一个区域设置头信息,先要到管理员工具界面中,然后设置属性。选择HTTP Header选单,你会看到2个有趣的区域:启用内容过期和定制HTTP头信息。头一个设置会自动配置,第二个可以用于设置Cache-Control头信息;

  设置asp页面的头信息可以参考后面的ASP章节,也可以通过ISAPI模块设置头信息,细节请参考MSDN。

  Netscape/iPlanet企业服务器

  3.6版本以后,Netscape/iPlanet已经不能设置Expires头信息了,他从3.0版本开始支持HTTP 1.1的功能。这意味着HTTP 1.1的缓存(代理服务器/浏览器)优势都可以通过你对Cache-Control设置来获得。

  使用Cache-Control头信息,在管理服务器上选择内容管理|缓存设置目录。然后:使用资源选择器,选择你希望设置头信息的目录。设置完头信息后,点击“OK”。更多信息请参考Netscape/iPlanet企业服务器的手册。

  缓存机制的实现:服务器端脚本

  需要注意的一点是:也许服务器设置HTTP头信息比脚本语言更容易,但是两者你都应该使用。

  因为服务器端的脚本主要是为了动态内容,他本身不产生可缓存的文件页面,即使内容实际是可以缓存的。如果你的内容经常改变,但是不是每次页面请求都改变, 考虑设置一个Cache-Control: max-age头信息;大部分用户会在短时间内多次访问同一页面。例如: 用户点击“后退”按钮,即使没有新内容,他们仍然要再次从服务器下载内容查看。

  CGI程序

  CGI脚本是生成内容流行的方式之一,你可以很容易在发送内容之前的扩展HTTP头信息;大部分CGI实现都需要你写 Content-Type头信息,例如这个Perl脚本:

  #!/usr/bin/perl

  print "Content-type: text/html ";

  print "Expires: Thu, 29 Oct 1998 17:04:19 GMT ";

  print " ";

  ### 后面是内容体...

  由于都是文本,你可以很容易通过内置函数生成Expires和其他日期相关的头信息。如果你使用Cache-Control: max-age;会更简单;

  print "Cache-Control: max-age=600 ";

  这样脚本可以在被请求后缓存10分钟;这样用户如果按“后退”按钮,他们不会重新提交请求;

  CGI的规范同时也允许客户端发送头信息,每个头信息都有一个‘HTTP_’的前缀;这样如果一个客户端发送一个If-Modified-Since请求,是这样的:

  HTTP_IF_MODIFIED_SINCE = Fri, 30 Oct 1998 14:19:41 GMT

  参考一下cgi_buffer库,一个自动处理ETag的生成和校验的库,生成Content-Length属性和对内容进行gzip压缩。在Python脚本中也只需加入一行;

  服务器端包含 Server Side Includes

  SSI(经常使用.shtml扩展名)是网站发布者早可以生成动态内容的方案。通过在页面中设置特别的标记,也成为一种嵌入HTML的脚本;

  大部分SSI的实现无法设置校验器,于是无法缓存。但是Apache可以通过对特定文件的组执行权限设置实现允许用户设置那种SSI可以被缓存;结合XbitHack调整整个目录。更多文档请参考mod_include文档。

  PHP

  PHP是一个内建在web服务器中的服务器端脚本语言,当做为HTML嵌入式脚本,很像SSI,但是有更多的选项,PHP可以在各种Web服务器上设置为CGI模式运行,或者做为Apache的模块;

  缺省PHP生成副本没有设置校验器,于是也无法缓存,但是开发者可以通过Header()函数来生成HTTP的头信息;

  例如:以下代码会生成一个Cache-Control头信息,并设置为3天以后过期的Expires头信息;

  Header("Cache-Control: must-revalidate");

  $offset = 60 * 60 * 24 * 3;

  $ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";

  Header($ExpStr);

  ?>

  记住: Header()的输出必须先于所有其他HTML的输出;