为什么不是我的javascript& css缓存?

时间:2009-05-08 18:36:47

标签: apache http .htaccess caching etag

它只显示javascript和css不缓存......但图像正在缓存。

我正在使用Firebug,当我刷新页面时,我在Firebug中注意到js / css有很多 200个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吗?

6 个答案:

答案 0 :(得分:5)

请考虑禁用 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请求。根据我的经验,这是积极的,因为Web服务器处理的请求较少,浏览器更多地依赖于您提供的Cache-Control设置。但它可能适合你,也可能不适合你。如果你为它们提供“Last-Modified”标题,有些浏览器会每隔几分钟尝试验证资产,这就是为什么我会建议完全禁用它的使用。

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

答案 1 :(得分:2)

YSlow报告错误配置的etags如果他们不遵守某种模式。因为你正在压缩css和js,所以etags的输出是这样的:

Etag "1e10-4889909861a80"-gzip

最后看到-gzip?它由apache(仅限版本2)放在那里。这就是造成“错误”的原因。 YSlow希望看到类似的东西:

Etag "xxxx-xxxxxxxxxxxxx"

基本上,你不能解决这个问题,因为它没有被打破。所以,如果你不知道自己在做什么,不要试图获得满分。即使雅虎主页只有90。

答案 2 :(得分:2)

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

YSlow 实际抱怨您正在使用ETags

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

当然,如果您使用的是单服务器设置,或者如果您使用的是分布式服务器,但知道自己在做什么,那么ETag就可以了。但是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

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:1)

我遇到了和你一样的问题。 删除etag将有效。

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

答案 5 :(得分:0)

嗨我遇到了同样的麻烦。 但只是放入FileETag就没有用了

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

FileETag none

位于我的htaccess文件的底部。

然后ySlow很开心。