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

10 apache .htaccess etag caching http

它似乎只有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
Run Code Online (Sandbox Code Playgroud)

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

小智 6

请考虑禁用 ETag!

请考虑以下设置:

Header unset ETag
FileETag None
Header set Cache-Control "max-age=2678400"
Run Code Online (Sandbox Code Playgroud)

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

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

Header unset Last-Modified
Run Code Online (Sandbox Code Playgroud)

它告诉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/测试您的资产,它会快速告诉您标题对浏览器的意义,以及如何解释您使用的不同缓存控制设置.


ste*_*heg 1

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

有关 ETag,请阅读http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

也许您只想在服务器上禁用 ETag。

编辑:另外,使用 LiveHTTPHeaders 插件来了解您的浏览器的功能。对于此任务,它比 FireBug 效果更好。