13

I have a handful of directories with content which will never change.

Is it possible to create .htaccess file which tells the browser that anything in this directory and sub- directories can be cached for a very long time?

I would like to copy the same .htaccess file in each directory if possible.

If this is possible would you recommend max-age over expires or both?

4

2 回答 2

22

所以它看起来确实可能...... .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 - Not Modified 并将 max-age 重置为 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. 将 max-age 设置为 1 年(推荐最长)
  2. 发送 1 年的 expires 标签
  3. 发送一个 Etag,因此 1 年后浏览器将执行 etag 验证
  4. 让中间缓存设备/服务知道他们可以将文件缓存 1 年。
于 2013-05-25T19:26:49.780 回答
2

仅供参考,如果您执行上述操作并且您的 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 中取消注释此行:

#LoadModule expires_module modules/mod_expires.so
于 2013-12-17T21:34:34.413 回答