【问题标题】:Apache not caching static contentApache不缓存静态内容
【发布时间】:2015-08-07 16:52:29
【问题描述】:

我阅读了最新 Apache httpd 版本的官方缓存指南,但不明白如何获得静态内容的最小缓存设置。

四处搜索,我终于将这些规则添加到我的 /etc/apache2/apache2.conf 中(我使用的是 Ubuntu):

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 5 seconds"
  ExpiresByType image/x-icon "access plus 2592000 seconds"
  ExpiresByType image/jpeg "access plus 2592000 seconds"
  ExpiresByType image/png "access plus 2592000 seconds"
  ExpiresByType image/gif "access plus 2592000 seconds"
  ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
  ExpiresByType text/css "access plus 604800 seconds"
  ExpiresByType text/javascript "access plus 216000 seconds"
  ExpiresByType application/javascript "access plus 216000 seconds"
  ExpiresByType application/x-javascript "access plus 216000 seconds"
</IfModule>

<IfModule mod_headers.c>
     Header set Cache-Control "public"
</IfModule>

FileETag None

显然,我已经启用了过期、标头、缓存模块。

当我尝试访问图像、css 或 js 文件时,我第一次看到 200 OK,接下来看到 304。所以,我认为我是对的......但 Google Pagespeed(例如)仍然抱怨没有缓存的文件。

实际上,我有些怀疑我遗漏了一些东西:

  • 我没有激活 mod_cache 或 mod_cache_disk。我是不是该?这样做的基本规则是什么?
  • 为什么需要禁用 ETag?
  • 我绝对需要我的缓存在文件更改时突然过期:理想情况下,过期时间(对于 css、js)可能会很长,比如说两周,但如果文件在一周后更改小时,用户应该强制获取更新的文件!该行为是否由 Apache 自动管理?

【问题讨论】:

  • 编辑了我的问题,缓存控制始终公开。仍未缓存在 Google pagespeed 或网页测试工具中
  • 如果删除块周围的&lt;IfModule 标签,是否会出现内部服务器错误?
  • 不。它仍然有效
  • Google pagespeed 通常会将自己的结果缓存一段时间。

标签: apache caching static-content mod-expires


【解决方案1】:

当文件更改时,我绝对需要我的缓存突然过期

T当您使用 mod_expires 发送 Expires 标头时,客户端不必确保文件是新鲜的并且您永远不能强制更改。

如果您删除 mod_expires,您的静态文件将有一个 ETAG 和一个最后修改时间,允许浏览器确保文件没有更改(这些是 304 响应)。

您需要 a) 更仔细地检查 pagespeed 消息 B) 根据您的要求评估它们并 C) 查看访问日志中的真实世界流量 wrt 304。

您不希望 mod_cache 用于静态文件。

【讨论】:

  • 好的,谢谢,但是...如果我不使用 mod_expires.. 我应该改用什么?默认的 Apache 安装没有开箱即用地设置缓存标头。什么是最小设置?
  • 如果它设置了 ETAG 或 Last-Modified-Time(因为它将在所有静态文件上),客户端可以通过条件请求检查他们是否拥有最新和最好的。没有其他方法可以让您在更新时强制更改文件。
  • 好的。但问题是:如何在 Apache 中启用该行为?我已经知道这个理论了