所以我一直在使用Minify压缩我的JS和CSS,这些都一直很顺利,直到我需要压缩一些动态的php样式表.
我试图用htaccess来欺骗它以为它是一个css文件,但后来我意识到它使用的绝对文件路径不会受到mod_rewrite的影响
无论如何,每当我指向一个php文件时,它总是返回’400 Bad Request’.除了编写自己的压缩脚本之外,还有任何想法可以解决这个问题吗?
解决方法:
我发现处理缩小和压缩样式表的最佳方法是自己动手.看看这段代码:
<?php
header("Content-Type: text/css");
header("Last-Modified: ".gmdate('D, d M Y H:i:s', filemtime($_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF']))." GMT");
header("Expires: ".gmdate('D, d M Y H:i:s', (filemtime($_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF']) + 691200))." GMT");
//This GZIPs the CSS for transmission to the user
//making file size smaller and transfer rate quicker
ob_start("ob_gzhandler");
ob_start("compress");
//Function for compressing the CSS as tightly as possible
function compress($buffer) {
//Remove CSS comments
$buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
//Remove tabs, spaces, newlines, etc.
$buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer);
return $buffer;
}
//Main style
require_once($_SERVER['DOCUMENT_ROOT']."/templates/style/style.css");
//Other style
if($php_variable) {
require_once($_SERVER['DOCUMENT_ROOT']."/templates/style/other.css");
}
ob_end_flush();
ob_end_flush();
?>
这里有很多事情,所以让我解释一下.
头
>将文件类型设置为CSS.
>为缓存控制设置Last-Modified和Expires标头(稍微超过一周的设置,您可以更改此设置).
Minify和GZIP
>使用ob_start,我们告诉它GZIP这个文件以及运行自定义函数compress.
> compress会在发送到浏览器时删除所有CSS注释和空白区域.这意味着您可以在源文件中保留所有注释和间距,以便于编辑,但只能将最小值发送到浏览器.
样式
>使用require导入样式表.为你想要的多种样式表做这件事;它们都会在一个HTTP请求中传递给用户.
使用您的新文件
你将像普通的CSS文件一样调用文件.
<style type="text/css" src="/path/to/css-script.php"></style>
结论
使用这种方法,你做了几件很棒的事情.
>为缓存提供正确的标题,快速回访您的网站.
> Minifys所有内容不包含额外的空格或注释.
>使用GZIP压缩文件以获得更小的文件大小.
>在一个HTTP请求中包含所有样式表,非常适合优化.
>避免使用@import语句……这本身就很棒.
>允许您保留多个样式表并使用PHP逻辑包含或不包含它们.
>允许您根据需要保持源样式表的间隔和注释,而不会对访问者产生任何影响.
您也可以对JavaScript使用相同的方法,虽然上面的压缩函数严格用于CSS,所以我会省略它.
将此技术与此缓存控制技术结合使用,您已经构建了一个非常棒的CSS / JS处理程序:How to force browser to reload cached CSS/JS files?