假设我没有将mod_deflate编译成apache,我现在不想重新编译。手动方法的缺点是什么,例如:类似的东西:
AddEncoding x-gzip .gz
RewriteCond %{HTTP_ACCEPT_ENCODING} gzip
RewriteRule ^/css/styles.css$ /css/styles.css.gz
(注意:我知道RewriteCond的具体内容需要调整稍微)
答案 0 :(得分:3)
另一种选择是将所有内容转发到PHP脚本,该脚本可以动态gzips和缓存所有内容。在每个请求中,它会将时间戳与缓存版本进行比较,如果它比源文件更新则返回。使用PHP,您还可以覆盖HTTP标头,因此它被正确对待,就好像它本身就是GZIPed一样。
这样的事情可能适合你:
的.htaccess
RewriteEngine On
RewriteRule ^(css/styles.css)$ cache.php?file=$1 [L]
cache.php:
<?php
// Convert path to a local file path (may need to be tweaked)
cache($_GET['file']);
// Return cached or raw file (autodetect)
function cache($file)
{
// Regenerate cache if the source file is newer
if (!is_file($file.'.gz') or filemtime($file.'.gz') < filemtime($file)) {
write_cache($file);
}
// If the client supports GZIP, send compressed data
if (!empty($_SERVER['HTTP_ACCEPT_ENCODING']) and strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) {
header('Content-Encoding: gzip');
readfile($file.'.gz');
} else { // Fallback to static file
readfile($file);
}
exit;
}
// Saved GZIPed version of the file
function write_cache($file)
{
copy($file, 'compress.zlib://'.$file.'.gz');
}
您将需要apache的写权限才能生成缓存版本。您可以稍微修改脚本以将缓存文件存储在其他位置。
这尚未经过广泛测试,可能需要根据您的需要稍作修改,但这个想法就足够了,应该足以让您入门。
答案 1 :(得分:1)
手动和自动方法之间似乎没有太大的性能差异。我做了一些自动和手动压缩的apache-bench运行,两次都在4%之内。
明显的缺点是你必须在部署之前手动压缩CSS文件。您可能想要确定的另一件事是您的配置正确。当我尝试使用手动方法时,我无法自动解码css,ab报告也列出了压缩数据大小而不是自动压缩的未压缩数据。
答案 2 :(得分:1)
你也可以使用mod_ext_filter并通过gzip管道。事实上,这是其中一个例子:
# mod_ext_filter directive to define the external filter ExtFilterDefine gzip mode=output cmd=/bin/gzip <Location /gzipped> # core directive to cause the gzip filter to be # run on output SetOutputFilter gzip # mod_header directive to add # "Content-Encoding: gzip" header field Header set Content-Encoding gzip </Location>
这样做的好处在于它真的非常容易......缺点是每个请求都会有额外的fork()
和exec()
,这显然会对性能产生很小的影响。< / p>