我在htaccess的这些指令:为什么浏览器要求缓存文件?
# BEGIN Compress text files
<ifModule mod_deflate.c>
<filesMatch "\.(css|js|x?html?|php)$">
SetOutputFilter DEFLATE
</filesMatch>
</ifModule>
# END Compress text files
# BEGIN Expire headers
<ifModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 seconds"
ExpiresByType image/x-icon "access plus 86400 seconds"
ExpiresByType image/jpeg "access plus 86400 seconds"
ExpiresByType image/png "access plus 86400 seconds"
ExpiresByType image/gif "access plus 86400 seconds"
ExpiresByType application/x-shockwave-flash "access plus 86400 seconds"
ExpiresByType text/css "access plus 86400 seconds"
ExpiresByType text/javascript "access plus 86400 seconds"
ExpiresByType application/javascript "access plus 86400 seconds"
ExpiresByType application/x-javascript "access plus 86400 seconds"
ExpiresByType text/html "access plus 600 seconds"
ExpiresByType application/xhtml+xml "access plus 600 seconds"
</ifModule>
# END Expire headers
# BEGIN Cache-Control Headers
<ifModule mod_headers.c>
<filesMatch "\.(ico|jpe?g|png|gif|swf)$">
Header set Cache-Control "max-age=86400, public"
</filesMatch>
<filesMatch "\.(css)$">
Header set Cache-Control "max-age=86400, public"
</filesMatch>
<filesMatch "\.(js)$">
Header set Cache-Control "max-age=86400, private"
</filesMatch>
<filesMatch "\.(x?html?|php)$">
Header set Cache-Control "max-age=600, private, must-revalidate"
</filesMatch>
</ifModule>
# END Cache-Control Headers
# BEGIN Turn ETags Off
<ifModule mod_headers.c>
Header unset ETag
</ifModule>
FileETag None
# END Turn ETags Off
# BEGIN Remove Last-Modified Header
<ifModule mod_headers.c>
Header unset Last-Modified
</ifModule>
# END Remove Last-Modified Header
(从here拍摄)
我使用Chrome浏览器测试,我已经注意到,应缓存的CSS文件,真不被高速缓存:
为一个随机CSS文件的请求头是:
Accept:text/css,*/*;q=0.1
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:es-ES,es;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:sua_language=en; keep=0; user=0; PHPSESSID=hn5gt5nb1j4sfq1j6m40un3it6; language=es
Host:podo.com
If-Modified-Since:Tue, 01 Nov 2011 17:20:59 GMT
Referer:http://podo.com/sheet?id=48
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.53 Safari/534.30
和反应是:
Cache-Control:max-age=86400, public
Connection:Keep-Alive
Date:Tue, 28 Feb 2012 17:50:04 GMT
Expires:Wed, 29 Feb 2012 17:50:04 GMT
Keep-Alive:timeout=5, max=99
Server:Apache/2.2.15 (Unix) DAV/2 PHP/5.2.10
Vary:Accept-Encoding
我也有被任何JS文件之前执行以下步骤的代码:
// Set document header
header('Content-Type: text/javascript; charset=UTF-8');
$expires = ONE_DAY;
header("Pragma: public");
header("Cache-Control: maxage=".$expires);
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT');
,我已经注意到,如果我评论这些行并重新加载页面(而不是通过按F5键,使用导航按钮),一些(不是全部)Javascript文件具有与CSS文件相同的行为(强制重新加载)。
发生了什么事?为什么CSS文件从不缓存?为什么JS文件有时被缓存,有时不是?
更新:我发现,如果我评论的线< ifModule mod_expires.c >和它相应的结束标记,一切正常,这是,CSS文件不要求(与JS文件的情况) 。现在的问题是:为什么?
UPDATE 2:当一个CSS文件接收第一时刻(200响应)响应标头:
Accept-Ranges:bytes
Cache-Control:max-age=86400, public
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:1633
Content-Type:text/css
Date:Thu, 01 Mar 2012 16:01:53 GMT
Expires:Fri, 02 Mar 2012 16:01:53 GMT
Keep-Alive:timeout=5, max=99
Server:Apache/2.2.15 (Unix) DAV/2 PHP/5.2.10
Vary:Accept-Encoding
请求头是相同的。
”响应的主体将是空的“。我不知道您是否在引用“内容”标签上显示的Chrome。这里显示了文件的全部内容。但它也显示了*(从缓存)*文件相同。这一点是为什么一些文件“重新检查”和其他文件没有?我的意图是避免任何复核。 此外,我试图改变“公共”和“私人”类型没有任何改变。 – Ivan 2012-02-28 18:51:00
我打算明天去玩一下,看看我能否拿出一个明确的答案。我认为这可能与'private' /'public'指令有关,请尝试清除浏览器缓存并将CSS/JS设置为'private',以查看是否摆脱了其他请求。 – DaveRandom 2012-02-29 00:57:12
我已经测试过所有组合没有成功,没有变化。你见过我的更新吗? – Ivan 2012-02-29 09:37:29