【发布时间】:2016-02-28 20:41:43
【问题描述】:
在 Debian 8.2 上使用 Apache 2.4,我正在尝试启用所有 css 和 js 文件的缓存。图像缓存工作正常;也就是说,浏览器收到 304 状态,因此不再下载。但我无法缓存其他文件。
我在虚拟主机文件中使用它:
<IfModule mod_expires.c>
<FilesMatch "\.(jpe?g|png|gif|js|css)$">
ExpiresActive On
ExpiresDefault "access plus 1 week"
</FilesMatch>
</IfModule>
expires 模块已启用。我确实重新启动了 apache,清理了浏览器 cookie 等。没有成功。
来自浏览器开发者工具的 gif 图片响应:
Cache-Control:max-age=604800
Connection:Keep-Alive
Date:Wed, 25 Nov 2015 21:37:50 GMT
ETag:"4174a-4e69c97fbf080"
Expires:Wed, 02 Dec 2015 21:37:50 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.10 (Debian)
css 文件的响应:
Accept-Ranges:bytes
Cache-Control:max-age=604800
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:135
Content-Type:text/css
Date:Wed, 25 Nov 2015 21:37:50 GMT
ETag:"5116-525639d271c78-gzip"
Expires:Wed, 02 Dec 2015 21:37:50 GMT
Keep-Alive:timeout=5, max=99
Last-Modified:Wed, 25 Nov 2015 20:50:52 GMT
Server:Apache/2.4.10 (Debian)
Vary:Accept-Encoding
看起来过期标题设置正确,但浏览器一直在请求文件(200 OK)。
我尝试使用 Chrome 和 Firefox。
总结:
1.) 当我点击网站内的链接时,浏览器会使用缓存文件。但是当我按F5时,他们重新下载了css和js文件,但他们没有重新下载图像。图像给出 304。这很好。
2.) 当我按下 Ctrl-F5 时,很自然地,所有文件都会重新下载。那也不错。
3.) 所以问题是如何为其他文件启用缓存(就像图像一样)。为什么 apache 区分图像和其他文件?我没有在配置文件中对图像添加任何特殊内容。
Q:如何正确启用css和js文件的缓存?
另一个问题:是否有一个特殊的 http 标头告诉浏览器永远不要请求文件。原因是,发送一个请求来检查文件是否被修改需要 100-200 毫秒,这太多了。我确信这些文件不会被修改。而且如果他们被修改了,我可以很容易地在css文件的末尾放一个版本字符串,比如myFile.css?v=1.1 所以我希望应该有一种方法可以完全停止发送请求。
已解决
首先,下面的答案中提到了 apache 中的一个错误。
其次,我的理解有误。我想这就是现代浏览器的工作方式:
1.) 关注网站内的链接:不发送请求,即使检查文件是否已被修改。
2.) F5:发送请求。如果文件未被修改,则服务器响应 304。
3.) Ctrl+F5:完全下载。
关于 F5 的行为对我来说没有意义。无论如何。
如果有人需要,这是我放入虚拟主机文件的可行解决方案:
RequestHeader edit "If-None-Match" "^\"(.*)-gzip\"$" "\"$1\""
Header edit "ETag" "^\"(.*[^g][^z][^i][^p])\"$" "\"$1-gzip\""
LoadModule expires_module /usr/lib/apache2/modules/mod_expires.so
ExpiresActive On
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
ExpiresDefault "access plus 4 weeks"
</FilesMatch>
【问题讨论】:
标签: apache http-headers