Назад | Перейти на главную страницу

Apache mod_expires вопрос

Меня действительно сбивает с толку все это кеширование. Я пытаюсь настроить mod_expires сократить количество HTTP Requests с моего сайта на сервер.

Пока все хорошо, я установил mod_expires и написал небольшой файл .conf из инструкций на http://httpd.apache.org/docs/2.0/mod/mod_expires.html.

Вот, например, все мои .png, .gif, .jpeg файлы имеют Cache-Control заголовок. Я ожидал, что браузер ничего не сделает. GET Request в течение периода времени (заданного из Cache-Control стоимость). Но это так, каждый файл запускает запрос и получает HTTP 304 not Modified.

Это неправильное поведение, не так ли? Он должен загрузить эти файлы из внутреннего кеша. Я не понимаю, что браузер отправляет Response header: Cache-Control: max-age=0. Так должно быть?

Вот полный пример Request + Response headers для одного .png file:

Запрос

Host             dev-mgg.localdomain
User-Agent     Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.8) Gecko/20100722     Firefox/3.6.8
Accept         image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language  de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding  gzip,deflate
Accept-Charset   ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive     115
Connection     keep-alive
Referer       http://dev-mgg.localdomain/css/global/icons.css?18224
Cookie         IR_SQLPwdStore=; IR_SQLUser=sysadm
If-Modified-Since   Thu, 24 Jul 2008 06:24:11 GMT
If-None-Match   "4010127-3c4-452bf1aefd8c0"
Cache-Control   max-age=0

отклик

Date         Mon, 02 Aug 2010 14:00:28 GMT
Server     Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny8 with Suhosin-Patch mod_perl/2.0.4     Perl/v5.10.0
Connection   Keep-Alive
Keep-Alive   timeout=15, max=59
Etag         "4010127-3c4-452bf1aefd8c0"
Expires   Mon, 02 Aug 2010 14:04:28 GMT
Cache-Control   max-age=240

В Cache-Control max-age=240 вы установили на сервере с помощью mod_expires немного мало для проведения тестов, он сообщает браузеру хранить данные в кеше всего 4 минуты (240 секунд).

Итак, первое, что вы могли бы сделать, - это увеличить это значение до более продолжительного периода, например, недели, чтобы вы могли проводить тестирование без бега.

#Set caching on image files for 11 months
<filesMatch "\.(ico|gif|jpg|png)$">
  ExpiresActive On
  ExpiresDefault "access plus 1 week"
  Header append Cache-Control "public"
</filesMatch>

В любом случае ваш тест был выполнен после того, как вы нажали кнопку перезагрузки страницы браузера. Как только вы это сделаете, браузер отправит запрос с Cache-Control max-age=0 говоря серверу, чтобы он снова вернул ему весь ресурс. Вы должны проверить, работает ли кеширование НЕ принудительно, а просто:

  • перейдя на другой веб-сайт, а затем вернувшись на тестовую страницу.

  • Или вы можете закрыть браузер, а затем снова открыть его на той же странице.

Выполняя тест, который я перечислил выше, вы должны увидеть, что браузер не запрашивает такую ​​же повторную попытку снова, потому что сервер сказал браузеру, что он должен сохранить ресурс в кеше и вывести его из формы в течение 1 недели.

и добро пожаловать в чудесный мир Интернета (серверы | браузеры)!

Как в конечном итоге ведут себя веб-браузеры, это почти зависит от веб-браузера. Некоторые браузеры вообще не запрашивают уже кэшированные изображения, некоторые -. Некоторые будут запрашивать их, только если настроены для частного просмотра или чего-то подобного.

И если у вас есть динамическая веб-страница, скорее всего, ваш браузер все равно будет пытаться загрузить статические изображения, даже если бы браузеру было сказано ранее, что ему не нужно возвращаться для изображений. В этих случаях браузер попытается запросить изображение, и сервер ответит 304 Not Modified.

Но не волнуйтесь, это единственный ответ, который вернет ваш браузер. Для этого конкретного запроса больше не передается никаких данных, поэтому с точки зрения ресурсов это очень легкая вещь.

Иногда помогает, если вы обслуживаете изображения с другого доменного имени (скажем, static.yourdomain.com вместо того www.yourdomain.com), но будьте уверены, браузеры похожи на Терминатор 2, они вернутся раньше, чем вы думали. Простого Ctrl + F5 или Ctrl + Shift + R достаточно, чтобы заставить ваш обычный браузер обновлять ВСЕ.

(Пожалуйста, поправьте меня, если я ошибаюсь.)