css缓存问题

时间:2011-06-01 17:33:09

标签: php css

我在我的css上使用gzip来压缩页面加载。为此,我制作了我的css(stylesheet.css.php)文件。

这是我在文件中包含的PHP脚本:

<?php
   ob_start ("ob_gzhandler");
   header ("content-type: text/css; charset: UTF-8");
   header ("cache-control: must-revalidate");
   $offset = 60 * 60;
   $expire = "expires: " . gmdate ("D, d M Y H:i:s", time() + $offset) . " GMT";
   header ($expire);
?>
/*css stuff*/

我知道($ offset = 60 * 60;)是“发送'Expires'标题,用于设置我们的缓存文件将持续多长时间。我们将其设置为在一小时后到期。”

我的问题很明显,如果它每小时过期,我改变一个CSS设置,它不会更新,直到一个小时,从而给用户未更新的样式表?如何将其更改为每分钟更新一次,以便每分钟而非小时获取更新stlyesheet?我会把($ offset = 60;)意味着1秒吗?

当我使用HTTPS时,我的另一个问题是在Internet Explorer中,并说用户点击后退按钮IE会显示消息“您是否只想查看已安全发送的网页内容”,您可以单击“是”或“否”。如果单击“否”,则不会在上一页上加载CSS。我使用链接href ='/ css / stylesheet.css'路径格式访问我的CSS,所以无法理解为什么它不安全? 感谢

3 个答案:

答案 0 :(得分:1)

你做不到。

过期意味着不要向客户提出额外要求 您必须等待1小时以确保刷新所有用户缓存。

肮脏的方法是在你改变你的CSS时附加一个参数。

类似的东西:

style.css?param=123 

答案 1 :(得分:1)

要缩短客户端再次请求文件之前等待的时间,您可以像说的那样缩短“偏移量”。 time()函数使用的单位是秒,因此'60'表示一分钟。如果你经常更新你的css,也许你根本不应该使用expires标题来节省麻烦,因为大多数客户端会自动缓存css文件。

https问题有两种解决方案。您可以通过http或https检查请求是否进入,并相应地为您的css文件写入url,或者仅使用//folder/path/to/cssfile.php作为css文件的路径。注意2斜杠和没有'http'。此表示法自动为您提供正确的协议like here

答案 2 :(得分:1)

你的建议是个坏主意。您想要设置它的方式将完全破坏CSS文件的所有缓存,并让您在每次请求时动态重新生成它。

提供gzip压缩文件肯定是最佳做法,问题就在于你这样做。首先,在每个请求上点击PHP解释器和gzipping是非常糟糕的性能,而不是否定提供压缩文件的好处。普通的HTTP文件请求的回复速度要快于PHP的速度。

另一个问题是,是的,你可以将到期时间减少到60秒(实际上,为零......但正如svanelten所说,此时你可能根本不会发送标题)。没有发送过期标题(或短标题)没有问题,如果那个真的你想要什么,但如果内容实际上没有改变那个,那么与动态生成页面相结合是不好的经常。这会中断If-Modified-Since,浏览器会发送这些条件请求,以便在文件未更改时不必重新下载文件。您没有设置Last-Modified时间,因此您的上次修改时间实际上始终是“正确的”。

有三种方法可以解决这些问题(并以缓存友好的方式实现更快地提供压缩CSS文件的原始目标):

  1. 只需在您的网络服务器配置中启用gzip编码,并将CSS作为常规文件提供。然后Web服务器处理所有事情。即在Apache2中,打开mod_deflate。

  2. 下一个最简单的方法是gzip文件并让您的Web服务器为其服务。这样,Web服务器负责发送Last-Modified(这只是实际的文件修改时间)。并且,它会发送HTTP/304 Not Modified以响应条件请求,因此浏览器不必重新下载文件。

    例如,如果您使用的是Apache,则可以将文件gzip并放在与常规css文件相同的目录中(例如,file.cssfile.css.gz)。然后将其放入Apache配置或.htaccess

    <Files *.css.gz>
      AddType "text/css" .gz
      AddEncoding gzip .gz
    </Files>
    
    RewriteEngine On
    RewriteCond %{HTTP:Accept-Encoding} gzip
    RewriteCond %{REQUEST_FILENAME}.gz -f
    RewriteRule ^(.*)$ $1.gz [QSA,L]
    
  3. 最后一种方式(如果你必须使用PHP)就是让PHP缓存gzip文件,发送文件实际上次修改时的Last-Modified标题,并通过实际检查这些内容然后相应地返回304或200响应来响应If-Modified-SinceIf-None-Match请求。我不推荐这个,因为它仍然会遇到PHP解释器,你基本上是在PHP中重新实现webserver函数,但我在特殊情况下已经完成了。这是最糟糕的解决方案,但至少比动态生成所有内容更好。