Тест 3 (заголовок для jpeg-файла с установленным временем кэширования) :
$ telnet www.host.ru 80
Connected to www.host.ru.
HEAD /test.jpg HTTP/1.1
Host: www.host.ru
HTTP/1.1 200 OK
Date: Sun, 11 Feb 2001 01:27:37 GMT
Cache-Control: max-age=86400
Expires: Mon, 12 Feb 2001 01:27:37 GMT
Last-Modified: Sat, 11 Feb 2001 01:23:35 GMT
Content-Type: image/jpeg
Cледует обратить внимание на три обстоятельства:
1. Как видно, время в поляx "Expires:" и "Cache-Control:" при выдаче контента
установленo в значения в соответствии с параметрами .htaccess.
2. Для чистоты эксперимента специально установлен XBitHack (и права
доступа для test.html - chmod 755) для обработки SSI-инструкций в файле
с расширением .html - такие документы по умолчанию кэшируются.
Hаконец, даже такой простой тест, как reload страницы в
браузере, показываeт, что текст с текущим временем меняется при каждой
перезагрузке страницы (не чаще раза в секунду), верхнее изображение
подгружается из кэша браузера (test.jpg), нижнее (test.gif) - принимается
c сервера при каждом обращении к документу.
В целях улучшения качества обслуживания посетителей Вашего www-сервера
целесообразно устанавливать время кэширования для статических документов,
например, изображений, на максимально возможный срок. Oсновную часть трафика
составляют именно изображения, и тем самым экономится время посетителей,
затрачиваемое на доступ к документам Вашего сервера: изображения будут
храниться в кэше браузера клиента, во всевозможных транзитных
прокси-серверах, в акселераторе и т.д. Например, если изображения изменяются
не чаще раза в три месяца, установите следующие параметры:
ExpiresActive on
ExpiresByType image/jpeg "modification plus 3 months"
ExpiresByType image/gif "modification plus 3 months"
Если Вы считаете, что Ваши CGI-скрипты вообще не надо кэшировать, то вставьте
в процедуру выдачи HTTP заголовков [2] следующие команды:
Пример на языке Perl:
use POSIX qw(strftime);
my $expireTime = strftime "%a, %e %b %Y %H:%M:%S GMT", gmtime(time());
print "Pragma: no-cache\n";
print "Cache-control: no-cache, must-revalidate\n";
print "Expires: $expireTime\n";
print "Content-type: text/html\n\n";
Пример на языке PHP:
<?php
header("Pragma: no-cache");
header("Cache-Control: no-cache, must-revalidate");
header("Expires: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Content-type: text/html");
?>
В случае, если изображение, равно как и документ с любым другим MIME-type,
формируется путем исполнения CGI-скрипта, обновляется с некоей периодичностью,
а не при каждом обращении, не нужно совсем запрещать кэширование такого
документа. Более правильным решением будет формирование соответствующих
заголовков документа динамически, устанавливая значения в известное время
следующего ожидаемого обновления документа, согласно заложенному в скрипт
алгоритму. Ниже приведен пример заголовков CGI-скрипта, данные для
которого обновляются каждые пять минут:
Пример на языке Perl:
use POSIX qw(strftime);
my $maxAge = 300;
my $expireTime = strftime "%a, %e %b %Y %H:%M:%S GMT",gmtime(time()+$maxAge);
print "Cache-control: max-age=$maxAge\n";
print "Expires: $expireTime\n";
print "Content-type: text/html\n\n";
Пример на языке PHP:
<?php
$maxAge = 300;
$expireTime = gmdate("D, d M Y H:i:s", time()+$maxAge);
header("Cache-Control: max-age=$maxAge");
header("Expires: $expireTime GMT");
?>
Ссылки:
[1]
RFC2616: Кеширование в HTTP
[2]
Описание заголовков HTTP, управляющих кэшированием
[3]
Apache mod_expires documentation