Другой альтернативой является пересылка всего на 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 для создания кэшированных версий , Вы можете немного изменить скрипт, чтобы хранить кешированные файлы в другом месте.
Это не было тщательно протестировано, и его, возможно, нужно немного изменить для ваших нужд, но идея все там и должна быть достаточной, чтобы вы начали.
Это означает, что каждый раз, когда вы меняете какой-либо файл, вы должны убедиться, что вы создали версию gzipped, или вы рискуете либо (1), когда gzipped пользователи будут обслуживать более старую версию файла или (2) случайным образом Если версия gzipped еще не выполнена. Только одна ошибка, и внезапно у вас есть Гейзенбуг, который очень сложно отследить. –
Да - конкретный прецедент здесь используется только для очень небольшого количества редко изменяющихся файлов, поэтому, хотя это и остается недостатком такого подхода, вероятно, это не шоу-стоппер. Я подумал о добавлении в цепочку «RewriteCond% {REQUEST_FILENAME} -f», но тогда возникает обеспокоенность по поводу неэффективности постоянной статистики файла (я не уверен, как/если apache кэширует эту информацию) –