Другой альтернативой было бы перенаправить все в скрипт PHP, который gzips и кэширует все на лету. При каждом запросе он сравнивает метки времени с кэшированной версией и возвращает ее, если она новее исходного файла. С помощью PHP вы также можете перезаписать заголовки HTTP, поэтому он обрабатывается должным образом, как если бы он был GZIPed самим Apache.
Что-то подобное может сделать работу за вас:
.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 для генерации кэшированных версий. Вы можете немного изменить скрипт, чтобы хранить кэшированные файлы в другом месте.
Это не было тщательно протестировано, и, возможно, его нужно немного изменить для ваших нужд, но идея в том, что его достаточно, чтобы начать работу.