我们目前不使用 Expire 标头,我本来想推荐它,但强迫我们的大型开发团队/企业改变他们的做法并在每次发布新版本时重命名静态文件并不容易获得更新的文件。
我运行了 YSlow,结果 Etags 评分为 F,“有 24 个组件的 ETag 配置错误”。Apache httpd.conf 没有手动配置 Etags,因此看起来我们使用的是默认设置。(FileETag INode MTime Size)。当我访问我们的网站然后点击刷新时,我可以看到 Etags 似乎运行良好:
一个图像示例:If-Modified-Since:Sat,23 Jul 2011 02:05:28 GMT If-None-Match:“21246-eb05-4a8b30415ea00”Cache-Control:max-age = 0
HTTP/1.1 304 未修改日期:2011 年 9 月 6 日星期二 20:59:29 GMT 服务器:IBM_HTTP_Server 连接:Keep-Alive Keep-Alive:超时 = 6 Etag:“21246-eb05-4a8b30415ea00”
1) 我在我们的着陆页上看到图像文件、js、html 等的“304 未修改”。为什么 Yslow 说我们的 Etag 配置有误,而它们都使用相同的默认 Apache 配置?YSlow 报告提到了这些相同的文件类型。
2) 我们在多个 Apache Web 服务器之间有一个 F5 负载均衡器,我们使用粘性位,这就是我认为 Apache inode Etag 不会给我们带来太多困扰的原因。但是,如果用户明天回来并访问另一个 Web 服务器,我们将失去缓存选项,对吗,因为它们的 indode 会有所不同?我们是否应该更改 httpd.conf 并从所有 Web 服务器中删除 Etag inode 变量?
抱歉太长了!谢谢
答案1
1) 也许该消息不是关于静态文件而是有关其他没有 ETag 的传递内容(例如 PHP 页面、CGI 输出等)?
2)是的,您应该从标签中删除 inode,并确保文件在所有后端上都有相同的时间戳。
答案2
C. Ramseyer 是正确的。下面是我用来让 YSlow 相当满意的配置:
<Directory /path/to/files>
FileETag MTime Size
ExpiresActive On
ExpiresDefault "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType text/javascript "access plus 1 week"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
</Directory>
但要确保你可以将页面缓存 1 周。例如,如果您有一个每天更新的博客,上述设置将导致帖子列表缓存 1 周。在这种情况下,您可能需要使用ExpiresDefualt "access"