2011-04-13 97 views
10

编辑:我真诚的道歉!除了我自己之外,这不是一个问题 - 我有一个global.css文件,里面包含正确的东西,但是在下面我包含了另一个带有旧CSS的文件,位于我的HTML的<head>位中。捂脸。浏览器不会读取更新CSS

我有一个网站,我正在开发。我正在使用LESS来增强我的CSS,使其更易于编写。问题是,当我更改.less文件时,浏览器中呈现的样式拒绝更改。我查看了生成的.css文件,该更新反映了所做的更改,但浏览器不会从CSS文件更新其呈现的样式。我已经在Chrome,FF(3和4)和Opera中尝试了这一点,并且具有相同的非更新结果。

我甚至告诉浏览器缓存什么,无论是与PHP和元标记,都无济于事。我的Apache配置文件几乎是香草,虽然我使用多个本地主机(这是一个本地服务器)。用于LESS转换为CSS代码如下给出,并且正在运行的每重新加载页面时间:

try 
{ 
    lessc::ccompile('global/global.less', 'global/global.css'); 
} 
catch(exception $ex) 
{ 
    exit('lessc fatal error:<br />' . $ex->getMessage()); 
} 

有没有例外这里。 less.php解析器检查文件是否已被修改,我已删除了一下,但是CSS文件是在每次更改时重新生成的,所以这必定是浏览器的缓存问题...... Apache提供更新的CSS文件就好了: -/

对不起,这么久了,但我想说清楚。如果你需要别的东西,请让我知道。

回答

20

有一次,我在一个代码看到了时间戳的使用,迫使浏览器下载cssjs文件每一项要求,即道:

<link rel="stylesheet" type="text/css" href="http://www.example.com/style.css?ts=<?=time()?>" /> 

?ts=123456789强制浏览器重新加载该文件时数与前一个不同。

所以我采用了这个想法,但是我没有使用now的时间戳,而是使用文件style.css修改的时间戳;因此它在浏览器缓存,直到在服务器上修改:

<link rel="stylesheet" type="text/css" href="http://www.example.com/style.css?ts=<?=filemtime('style.css')?>" /> 
+0

这解决了我烦人的问题。谢谢 – 2012-06-25 08:41:48

0

既然你无法控制浏览器缓存,我会建议你给你的CSS文件的版本。像global.1.11.css一样。

1

我使用LESS和Laravel,我终于想出了一个很好的解决方案:

在我<head>标签,我有:

<link rel="stylesheet/less" type="text/css" href="/less/main.less?ts={{FileHelper::getMostRecentModifiedTimeInFolder(realpath(public_path() . '/less'))}}" />

然后,我还创建了一个FileHelper类(基于https://stackoverflow.com/a/6767411/470749):

<?php 

class FileHelper { 

    public static function getMostRecentModifiedTimeInFolder($path) 
    { 
     //https://stackoverflow.com/a/6767411/470749 
     $iterator = new DirectoryIterator($path); 
     $mtime = -1; 
     foreach ($iterator as $fileinfo) { 
      if ($fileinfo->isFile()) { 
       if ($fileinfo->getMTime() > $mtime) { 
        $mtime = $fileinfo->getMTime(); 
       } 
      } 
     } 
     return $mtime; 
    } 

} 

我可能决定只在我的本地开发服务器上使用这种方法,并使用不同的方法进行生产,因此它并不总是在每次页面加载时检查文件时间戳。