2011-06-01 176 views
2

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

这包括内部文件,我的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*/ 

据我所知,($抵消= 60 * 60)被“发送‘过期’标头,设置在多久的时代我们缓存的文件将会持续,这里我们将它设置为在一小时内过期。“

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

我的其他问题是在Internet Explorer中,当我使用HTTPS并且说用户点击返回按钮IE给出消息“你想只查看安全递送的网页内容”,并且你可以点击“是”或“否” 。如果您点击“否”,那么CSS不会在该页面上加载。我访问我的CSS使用链接href ='/ css/stylesheet.css'路径格式,所以不能看到为什么它不安全? 谢谢

回答

1

为了缩短时间的客户再次请求文件之前等待,可以缩短你的“抵消”像你说的。函数time()使用的单位是秒,所以'60'意味着一分钟。如果你定期更新你的css,也许你不应该使用expires头文件来为你节省麻烦,因为大多数客户端会自动缓存css文件。

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

1

你不能那样做。

过期意味着不要求客户提出额外要求。
将不得不等待1小时以确保所有用户缓存都被刷新。

肮脏的方式是每当你改变你的css时追加一个参数。

喜欢的东西:

style.css?param=123 
1

你的建议是一个坏主意。您想要设置它的方式将完全打破CSS文件的所有缓存,并且可以为每个请求实时重新生成它。

这绝对是一个服务gzip文件的最佳实践,问题在于你这样做。首先,打开PHP解释器并在每个请求上进行gzip操作对性能来说都是非常不利的,并且不会否定提供压缩文件的好处。普通的HTTP文件请求比命中PHP要快10倍。

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

有三种方法来解决这些问题(并实现你的原始业务压缩CSS文件快,在高速缓存友好的方式的目标):

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

  2. 下一个最简单的方法是gzip该文件并让您的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中重新实现web服务器功能,但在特殊情况下我已经完成了它。这是最糟糕的解决方案,但至少比动态生成一切更好。