Apache:设置max-age或在目录的.htaccess中过期

我有一些内容永远不会改变的目录。

是否有可能创build.htaccess文件告诉浏览器该目录和子目录中的任何内容都可以caching很长时间?

如果可能,我想在每个目录中复制相同的.htaccess文件。

如果这是可能的,你会推荐max-age过期或两者?

所以它看起来可能…. .htaccess文件的语法是:

Header unset Last-Modified FileETag none ExpiresActive On ExpiresDefault "access plus 1 years" 

这将关闭Etags并打开缓存控制:max-age

然后把这个.htaccess文件放到目录中,所有的文件(包括它的子目录都会被缓存1年。

我决定将所有可缓存的内容放在单个根目录下,并编辑httpd.conf

 <Directory "C:\somedir\cache"> Header unset Last-Modified FileETag none ExpiresActive On ExpiresDefault "access plus 1 years" </Directory> 

我仍然在测试这个过程。 我只是希望这不会关闭网站其余部分的Etags。 到目前为止,它看起来像按计划运行。


更新(6个月后):

设置ExpiresDefault并允许电子标签是最好的事情。

在httpd.conf中:

 <Directory "C:\somedir\cache"> ExpiresActive On ExpiresDefault "access plus 1 year" </Directory> 

确保“somedir”位于Apache根目录(如htdocs)内。

允许电子标签是一件好事,因为1年后,浏览器将通过传递电子标签来重新验证文件。 Web服务器将发送一个304 – 未修改,并将最大年龄重置为1年。 这非常有效。

总而言之,您可以观看apache日志文件,并查看/ cache目录中的项目是否开始提供一次。

注意:我发现如果你愿意的话,设置Header append Cache-Control "public"是可以的。


最终版本:

这是最终版本:(只需在httd.conf的底部添加)

 <Directory "C:\somedir\cache""> ExpiresActive On ExpiresDefault "access plus 1 year" Header append Cache-Control "public" </Directory> 

检查标题应该显示这一点:

 Accept-Ranges:bytes Cache-Control:max-age=31536000, public Connection:Keep-Alive Content-Language:en Content-Length:746 Content-Type:text/css Date:Thu, 29 May 2014 15:23:50 GMT ETag:"240000000add63-2ea-4f4086d72ad01" Expires:Fri, 29 May 2015 15:23:50 GMT Keep-Alive:timeout=40, max=200 Last-Modified:Fri, 07 Mar 2014 18:28:59 GMT 

这会:

  1. 设置最大年龄为1年(建议最长)
  2. 发送1年的过期标签
  3. 发送一个Etag,所以一年后浏览器将执行etag验证
  4. 让中间缓存设备/服务知道他们可以缓存文件1年。

仅供参考,如果你做了上面提到的,你的Apache不会重新启动,那么你可能会得到这个错误:

 The Apache service named reported the following error: >>> Invalid command 'ExpiresActive', perhaps misspelled or defined by a module not included in the server configuration. 

你可以通过点击“开始”找到该错误,输入“计算机管理”,启动它,在树上打开“事件查看器 – > Windows日志 – >应用程序”。 这是我发现上面的错误。

简单的修复,只需在httpd.conf中取消注释:

 #Loadmodulee expires_module modules/mod_expires.so