11

似乎只有 javascript 和 css 没有缓存……但图像正在缓存。

我正在使用 Firebug,当我刷新页面时,我注意到 Firebug 中有很多200 个 js/css 的 HTTP 响应,但我的所有图像都收到了304 个 HTTP 代码(内容未修改)。所以看来我的 JS 和 CSS 没有缓存。

此外,当使用 YSlow 来帮助确定我的 JS/CSS 内容没有缓存的问题时,它会告诉我:

有 4 个组件的 ETag 配置错误

下面列出的是我的 .htaccess 文件

Options -Indexes
Options +FollowSymLinks  

# Enable ETag
FileETag MTime Size

# Set expiration header
ExpiresActive on
ExpiresDefault "access plus 1 week"

# Compress some text file types
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml application/x-javascript text/javascript application/javascript application/json

# Deactivate compression for buggy browsers
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

# Set header information for proxies
Header append Vary User-Agent

知道我的 .htaccess 访问文件有什么问题,阻止它缓存我的 CSS 或 JavaScript?

4

6 回答 6

7

请考虑禁用ETag!

考虑以下设置:

Header unset ETag
FileETag None
Header set Cache-Control "max-age=2678400"

前两条规则完全禁用 ETag,因此浏览器在某种程度上被迫监听 Cache-Control 标头。最后一条规则告诉浏览器缓存文件 2678400 秒,即 1 个月。将设置调整为最适合您的设置。并将此配置应用于包含静态文件的目录(例如,通过在该目录中放置一个 .htaccess 文件)

可选,如果您使用多个服务器来提供静态内容,和/或不确定这些服务器报告的最后修改时间,请考虑使用:

Header unset Last-Modified

它告诉 Apache 不提供任何 Last-Modified 标头,因此浏览器只能侦听 Cache-Control max-age 标头。

我自己在许多高流量网站上使用此设置,禁用 ETag 和 Last-Modified 标头确实有助于将流量降低到以前的五分之一。尤其是 Internet Explorer 对这些设置非常敏感。

警告:禁用 Last-Modified 将阻止浏览器询问 304 Content Not Modified 请求。以我的经验,这是积极的,因为网络服务器处理的请求较少,而浏览器更多地依赖于您提供的缓存控制设置。但它可能适合您,也可能不适合您。如果您为它们提供“Last-Modified”标头,某些浏览器会每隔几分钟尝试验证资产,这就是为什么我建议完全禁用它的原因。

哦,如果你不确定你的缓存;使用http://www.redbot.org/来测试您的资产,它会快速告诉您标题对浏览器意味着什么,以及如何解释您使用的不同缓存控制设置。

于 2011-12-13T22:39:08.097 回答
2

如果 etags 不遵守特定模式,YSlow 会报告错误配置的 etags。由于您正在压缩 css 和 js,因此输出的 etags 如下所示:

Etag "1e10-4889909861a80"-gzip

看到最后的 -gzip 了吗?它是由 apache 放在那里的(仅限第 2 版)。这就是导致“错误”的原因。YSlow 期望看到如下内容:

Etag "xxxx-xxxxxxxxxxxxx"

基本上,您无法解决此问题,因为它没有损坏。因此,如果您不知道自己在做什么,请不要疯狂地试图获得完美的分数。甚至那个雅虎主页也只有 90 分。

于 2010-06-09T13:57:08.360 回答
2

此 YSlow 错误消息极具误导性!

YSlow实际上是在抱怨您根本在使用 ETags

YSlow 在您的浏览器中运行——它无法知道 ETag 是否配置正确。根据经验,您不应该使用 ETag,因为在多服务器环境中,您更有可能将它们配置错误,而不是正确配置。(而 YSlow 的目标用户是拥有大型多服务器网站的用户。)

当然,如果您使用的是单服务器设置,或者如果您使用的是分布式服务器设置但知道自己在做什么,那么 ETags 就可以了。但 YSlow 无法知道这一点。

您应该查看的错误描述页面的评论中有很多关于此的讨论:http: //developer.yahoo.net/blog/archives/2007/07/high_performanc_11.html

我还在 ServerFault 上找到了这个答案,重申了这一点:https ://serverfault.com/questions/55919/yslow-says-etags-are-misconfigured-how-to-configure-etags-properly-on-iis7

于 2010-09-15T19:42:41.857 回答
1

我遇到和你一样的问题。删除 etag 将起作用。

在配置文件中添加以下内容: FileETag none

于 2009-07-30T04:08:44.317 回答
1

是的,这是正确且众所周知的行为(可能并不真正需要)。

阅读http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html关于 ETag。

可能您只想在服务器上禁用 ETag。

编辑:另外,使用 LiveHTTPHeaders 插件来了解您的浏览器的功能。它比 FireBug 更适合这项任务。

于 2009-05-08T19:43:32.773 回答
0

嗨,我有同样的麻烦。但是只是放入 FileETag none 没有用

我修复它的方式(我不知道这是否正确 - 但它有效)是我把

FileET 无标签

在我的 htaccess 文件的底部。

然后ySlow很高兴。

于 2010-01-11T04:03:21.880 回答