apache - 为什么我的 javascript 和 css 没有缓存?

标签 apache http .htaccess caching etag

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

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

此外,当使用 YSlow 帮助确定我的 JS/CSS 内容未缓存的问题时,它通知我:

There are 4 components with misconfigured ETags

下面列出的是我的 .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 吗?

最佳答案

请考虑禁用 ETag!

考虑以下设置:

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

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

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

Header unset Last-Modified

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

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

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

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

关于apache - 为什么我的 javascript 和 css 没有缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/841209/

相关文章:

PHP代码没有被执行,但是代码显示在浏览器源代码中

spring - ApacheConnectorProvider 与 Jersey for SSL 抛出错误

javascript - 未捕获的类型错误 : Object [object Object] has no method 'fancybox'

android - Cordova 错误 : Failed to fetch platform cordova-android//Error: cmd: Command failed with exit code ENOENT

css - maven 会创建 css 文件的副本吗?

php - 通过 HTTP 上传大文件

c# - 从 Host.TopLevelDomain C# 获取有效的 web url

javascript - 获取 http/https 协议(protocol)以匹配 maps.google.com 的 <iframe>

php - 我真的可以对致命的解析错误无所事事吗?

apache - ForceType/htaccess 文件扩展名问题 - 无扩展名文件?