我在我的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,所以无法理解为什么它不安全? 感谢
答案 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文件的原始目标):
只需在您的网络服务器配置中启用gzip编码,并将CSS作为常规文件提供。然后Web服务器处理所有事情。即在Apache2中,打开mod_deflate。
下一个最简单的方法是gzip文件并让您的Web服务器为其服务。这样,Web服务器负责发送Last-Modified
(这只是实际的文件修改时间)。并且,它会发送HTTP/304 Not Modified
以响应条件请求,因此浏览器不必重新下载文件。
例如,如果您使用的是Apache,则可以将文件gzip并放在与常规css文件相同的目录中(例如,file.css
和file.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]
最后一种方式(如果你必须使用PHP)就是让PHP缓存gzip文件,发送文件实际上次修改时的Last-Modified
标题,并通过实际检查这些内容然后相应地返回304或200响应来响应If-Modified-Since
和If-None-Match
请求。我不推荐这个,因为它仍然会遇到PHP解释器,你基本上是在PHP中重新实现webserver函数,但我在特殊情况下已经完成了。这是最糟糕的解决方案,但至少比动态生成所有内容更好。