Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Apache中启用css和js文件的缓存_Apache_Http Headers - Fatal编程技术网

在Apache中启用css和js文件的缓存

在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

在Debian8.2上使用Apache2.4,我试图启用所有css和js文件的缓存。缓存图像效果良好;也就是说,浏览器收到304状态,因此不再下载。但我无法让其他文件的缓存工作

我在虚拟主机文件中使用此选项:

<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,我将其关闭

对于你的第二个问题,只需设定一个很长的期限

如以下评论所述,有三种情况:

  • 正常浏览-应该使用缓存,只有在缓存过期后仍然有效时才使用304s(在这种情况下,它被设置为在相同过期时再次有效)

  • F5或刷新按钮。这是用户确认页面及其所有资源仍然有效的显式操作,因此它们都将被双重检查(即使那些仍在缓存中且根据expiries标头仍然有效),并在未更改时发送304s。这并不意味着“只需重新下载任何已过期的内容,但保留缓存项,因为它们仍然有效”,正如您所认为的那样。就我个人而言,我认为浏览器使用的当前实现是有意义的,您的方法会让最终用户感到困惑。虽然有些网站可能会对图像、css和JavaScript等资产进行版本设置,因此重新检查是浪费时间,但并非所有此类网站都会这样做

  • Ctrl+F5。这是一次强制刷新。它的意思是“忽略缓存并下载所有内容”。除了更改开发服务器上请求的文件的开发人员之外,很少需要它

  • 希望一切都有意义


    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标题。顺便说一句,修改了我的答案。当我理解时