Apache 不缓存静态内容
Apache not caching static content
我阅读了最新 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
显然,我已经启用过期,headers,缓存模块。
当我尝试访问图像、css 或 js 文件时,我第一次看到 200 OK,然后是 304。所以,我认为我是对的...但是 Google Pagespeed(例如)仍然抱怨未缓存的文件。
实际上,我怀疑我遗漏了什么:
- 我没有激活 mod_cache 或 mod_cache_disk。我是不是该?这样做的基本规则是什么?
- 为什么需要禁用 ETag?
- 我绝对需要我的缓存在文件更改时突然过期:理想情况下,过期时间(对于css,js)可能会很长,让我们比如说,两周,但是如果文件在一小时后发生变化,用户应该强制获取更新后的文件!该行为是否由 Apache 自动管理?
I absolutely need my cache to expire suddenly when the file is changed
T当您使用 mod_expires 发送一个 Expires header 时,客户端不必确保文件是最新的并且您永远不能强制更改。
如果你删除 mod_expires,你的静态文件将有一个 ETAG 和一个 last-modified-time 允许浏览器确保文件没有改变(这些是 304 响应)。
您需要 a) 更仔细地检查 pagespeed 消息 B) 根据您的要求对其进行评估以及 C) 查看访问日志中的真实世界流量 wrt 304s。
您不希望 mod_cache 用于静态文件。
我阅读了最新 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
显然,我已经启用过期,headers,缓存模块。
当我尝试访问图像、css 或 js 文件时,我第一次看到 200 OK,然后是 304。所以,我认为我是对的...但是 Google Pagespeed(例如)仍然抱怨未缓存的文件。
实际上,我怀疑我遗漏了什么:
- 我没有激活 mod_cache 或 mod_cache_disk。我是不是该?这样做的基本规则是什么?
- 为什么需要禁用 ETag?
- 我绝对需要我的缓存在文件更改时突然过期:理想情况下,过期时间(对于css,js)可能会很长,让我们比如说,两周,但是如果文件在一小时后发生变化,用户应该强制获取更新后的文件!该行为是否由 Apache 自动管理?
I absolutely need my cache to expire suddenly when the file is changed
T当您使用 mod_expires 发送一个 Expires header 时,客户端不必确保文件是最新的并且您永远不能强制更改。
如果你删除 mod_expires,你的静态文件将有一个 ETAG 和一个 last-modified-time 允许浏览器确保文件没有改变(这些是 304 响应)。
您需要 a) 更仔细地检查 pagespeed 消息 B) 根据您的要求对其进行评估以及 C) 查看访问日志中的真实世界流量 wrt 304s。
您不希望 mod_cache 用于静态文件。