caching css and javascript


caching css and javascript

缓存遇到问题…

我使用这个php文件与url重写压缩和缓存css和js

我的印象是,如果我改变/更新我的一个文件,浏览器会检索更新的文件。但它不会,除非我清除缓存或刷新页面。

我的编码错了吗?或者浏览器不应该得到更新的内容,直到缓存过期?

<?php
$file = $_SERVER['DOCUMENT_ROOT'].'/'.$_GET['file'];
$last_modified_time = filemtime($file);
$etag = md5_file($file);
$expires = 60*60*24*7;
if(file_exists($file))
{
    if($_SERVER['HTTP_IF_NONE_MATCH'] != $etag)
    {   
        header("Pragma: public");
        header("Cache-Control: maxage=$expires, must-revalidate");
        header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT');
        header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");
        header("Etag: '"{$etag}'"");
        if($_GET['type'] == 'js')  header('Content-type: application/javascript');
        if($_GET['type'] == 'css') header('Content-type: text/css');
        if($_GET['type'] == 'ico') header('Content-type: image/x-icon');
        ob_start("ob_gzhandler");       
        include($file);     
    }
    else {
        header('HTTP/1.0 304 Not Modified');
    }
}
else {
    header("HTTP/1.0 404 Not Found");
}
?>

重写规则
RewriteRule ^(.*).js$ /compress.php?file=$1.js&type=js [L,QSA]
RewriteRule ^(.*).css$ /compress.php?file=$1.css&type=css [L,QSA]
RewriteRule ^(.*).ico$ /compress.php?file=$1.ico&type=ico [L,QSA]    

---------

编辑:也许我应该这样做一个不同的方式?大公司使用什么来缓存,他们如何强制浏览器在缓存过期之前获取更新的内容?

编辑2:谢谢家伙的帮助。我要用1小时的缓存

浏览器不会刷新缓存文件,直到给定的Expires标头过期。如果它过期了,它会用If-None-Match头请求文件(我猜)。

但是为什么不通过.htaccess处理缓存控制呢?您可以查看mod_expires:

# Expires-Header
ExpiresActive On
ExpiresByType application/javascript "access plus 7 days"
ExpiresByType text/css "access plus 7 days"
# ETag
FileETag All

Gzip压缩以及mod_deflate:

AddOutputFilterByType DEFLATE text/css application/javascript

编辑:'大公司'不使用Expiresmax-age头,或者他们会设置这些头让缓存文件约1小时->与缓存的冲突将被最小化。

你错过了这些部分,我相信…

    $last_modified = filemtime($file);
    // Check for cached version
    if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) OR isset($_SERVER['HTTP_IF_NONE_MATCH'])) 
    {
        // these part should do that...
        if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == gmdate('D, d M Y H:i:s 'G'M'T', $last_modified)) 
        {
            header('HTTP/1.0 304 Not Modified');
            return;
        }
    }   
    header('Last-Modified : '.gmdate('D, d M Y H:i:s 'G'M'T', $last_modified));
    header('Cache-Control : max-age='.$expires.', must-revalidate');
    header('Expires : '.gmdate('D, d M Y H:i:s 'G'M'T', $last_modified + $expires));
    // and so on...

顺便说一句,帮助你确定,更多,相关如何你的缓存性能,甚至更好,你的整个应用程序的性能,你可以通过使用谷歌API性能测试它,或这些网站:http://www.webpagetest.org/(PS:只是例如,这些是我的最新结果为我的工作博客:http://www.webpagetest.org/result/110803_SB_17PVH/)

是的,理论上浏览器应该注意你发回的Cache-Control, Expires等信息,但在实践中,信任浏览器做正确的事情并不总是一个好主意。

你可能要考虑做的是在你的压缩。php脚本中添加第二步…让它重定向到实际的压缩文件,并将"?ts=".$last_modified_time之类的内容附加到文件的路径。这样,当文件更改时,URL也会更改,浏览器将更有可能做正确的事情并获取最新的文件。我以前用过类似的方法