使用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,并清除了浏览器的 cookies,但没有成功。从浏览器开发工具中查看 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
看起来expires标题设置正确,但浏览器仍然会请求文件(200 OK)。
我已经尝试了Chrome和Firefox。
概述:
1.)当我在网站内部跟随链接时,浏览器使用缓存文件。但是当我按F5键时,它们重新下载css和js文件,但不重新下载图像。图像返回304。这很好。
2.)当我按Ctrl-F5键时,自然而然地,所有文件都会重新下载。这也很好。
3.)因此问题在于如何启用其他文件的缓存(就像图像一样)。为什么Apache会区分图像和其他文件?我在配置文件中没有给图片放置任何特殊内容。
问题:如何正确启用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>