在Apache中启用css和js文件的缓存
在Debian8.2上使用Apache2.4,我试图启用所有css和js文件的缓存。缓存图像效果良好;也就是说,浏览器收到304状态,因此不再下载。但我无法让其他文件的缓存工作 我在虚拟主机文件中使用此选项:在Apache中启用css和js文件的缓存,apache,http-headers,Apache,Http Headers,在Debian8.2上使用Apache2.4,我试图启用所有css和js文件的缓存。缓存图像效果良好;也就是说,浏览器收到304状态,因此不再下载。但我无法让其他文件的缓存工作 我在虚拟主机文件中使用此选项: <IfModule mod_expires.c> <FilesMatch "\.(jpe?g|png|gif|js|css)$"> ExpiresActive On ExpiresDefault "access plus 1
<IfModule mod_expires.c>
<FilesMatch "\.(jpe?g|png|gif|js|css)$">
ExpiresActive On
ExpiresDefault "access plus 1 week"
</FilesMatch>
</IfModule>
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>
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中有一个bug,如下所述
第二,我有一个误解。我想这就是现代浏览器的工作原理:
1.)遵循网站内的链接:不发送任何请求,即使是检查文件是否已修改
2.)F5:发送请求。如果文件未修改,则服务器响应304
3.)Ctrl+F5:完全下载
关于F5的行为对我来说没有意义。无论如何
如果有人需要它,下面是我放入虚拟主机文件中的一个工作解决方案:
<IfModule mod_expires.c>
<FilesMatch "\.(jpe?g|png|gif|js|css)$">
ExpiresActive On
ExpiresDefault "access plus 1 week"
</FilesMatch>
</IfModule>
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>
RequestHeader编辑“如果没有匹配的话”^\(.*)-gzip\“$”$1“
标题编辑“ETag”^“(.[^g][^z][^i][^p])\“$”\“$1-gzip”
LoadModule expires\u module/usr/lib/apache2/modules/mod\u expires.so
过期于
ExpiresDefault“访问加4周”
关闭etag,当gzip打开304s时,它们在Apache中的性能不好
请看这里:
由于图像已经被压缩,所以它们通常不会被压缩,这就是它们工作的原因
依我看,etag在当前的实现中并没有那么有用(请参阅我的博客,以获得更深入的讨论,了解原因),因此,再加上上面的bug,我将其关闭
对于你的第二个问题,只需设定一个很长的期限
如以下评论所述,有三种情况:
2016年5月12日编辑:看起来Firefox带来了您真正想要的功能:为什么只是部分?我不知道浏览器使用HEAD请求。它们没有多大意义,因为必须使用完整的请求进行后续操作,所以它们只使用条件GET请求,一次完成所有操作。F5执行手动刷新以检查是否有任何更新,尽管缓存存在,因此会发送条件GET,因此,如果未修改文件,则会得到304(忽略Apache错误)。CTRL+F5表示执行完全获取-即使缓存中有一个文件,并且该文件仍然有效,也不应该获取完整的获取。当您认为缓存错误时,CTRL+F5非常有用(例如,您将文件恢复到服务器上的以前版本,所以尽管上次修改后仍不想下载)。如果您知道它不会有什么不同,为什么还要费心刷新呢?:-)我猜您正在考虑这样一种场景:页面HTML可能不同(假设没有缓存),但图像不会不同(并且是缓存的),所以您希望只下载页面HTML?好吧,这不是它的工作原理-F5的意思是“检查一切,看看什么,如果有的话,需要刷新”。我想浏览器可以实现一个轻量级的版本(例如Alt-F5),意思是“只刷新过期的资源”,就像你再次浏览该页面时一样——但可能比拥有3种刷新类型更令人困惑。你必须从用户的角度来考虑(因为他们是按F5按钮的人),而不是从服务器端。F5是一个明确的操作,用户说“我不确定此页面是否为最新版本-请再次为我检查浏览器”。是否设置Expires标头与此无关-用户要求浏览器再次检查。304是当检查证明文件仍然是最新文件时,在没有下载全部成本的情况下确认重复检查的方法。这不同于在适当的时候浏览Expires标题。顺便说一句,修改了我的答案。当我理解时