Меня довольно смущает весь доступ и модификация.
Я хочу, чтобы файлы кешировались до тех пор, пока они не будут изменены. Если данные совпадают, покажите версию кеша. Если данные изменились, загрузите обновленную версию и кешируйте ее.
Я не понимаю, почему вам нужно что-то другое? Весь этот доступ плюс 6 месяцев для меня не имеет смысла. Запросите новый файл, если дата последнего изменения новее даты кеширования. Разве это нельзя сделать так просто?
Я хочу иметь возможность создать index.html 01.01.2012, чтобы все кэшировали его. Я не хочу, чтобы его снова скачивали, пока я его не отредактирую. Скажем, я редактирую его 05.01.2012, и приходит тот, кто не видел index.html с 01.01.2012, они должны увидеть, что у них есть кеш 01.01.2012, но теперь время последнего изменения файла 05.01.2012, поэтому они скачивают версию от 05.01.2012 и кешируют.
Я никогда не хочу что-то редактировать, и пользователь не видит этого в течение какого-то периода времени. Я хочу, чтобы все мои правки были просмотрены по следующему запросу.
Как я могу сделать это для всех файлов?
Здесь есть две концепции: кеширование и экономия полосы пропускания. Для вашего варианта использования я бы забыл о Expires:
, но я объясню это позже.
Если вы обслуживаете физический файл из папки, веб-сервер добавит один или два заголовка:
ETag: xyzzas4324@asdad/33
: который работает как идентификатор для этой версии файла и изменяется при изменении содержимого файла; и / илиLast-Modified: <date>
: это та же дата модификации, что и в свойствах файла.Итак, в следующий раз браузер запросит http: // $ URL / file с небольшим изменением:
If-None-Match: xyzzas4324@asdad/33
; и / илиIf-Modified-Since: <same date>
Если файл не был изменен, сервер отправляет обратно 304 Not Modified
который сигнализирует браузеру, что он должен отображать кешированную версию.
Примечание: это позволило избежать только повторной передачи этого конкретного файла; браузеру все еще приходилось ждать ответа от веб-сервера. Так что задержка все еще есть.
Это где Expires
входит. Представьте, что запрошенный файл представляет собой RSS-канал. Если есть Expires: <2 hours from now>
заголовок, запрос будет не повторяться этим браузером в течение этого интервала, периода. Никакой задержки браузера при ожидании сервера, никакой повышенной нагрузки.
Есть книга, в которой более подробно рассказано: Создание масштабируемых веб-сайтов. Здесь более подробно рассматриваются эти приемы, но я дам вам краткое изложение:
Вот как вы должны изменить старый логотип на новый, если вы установили Expires: <6 years>
в целом assets/*
index.html
v1:
<h1>Welcome to Example Inc!</h1>
<img src="assets/logo_v1.jpg">
index.html
v2:
<h1>Welcome to Example Inc!</h1>
<img src="assets/logo_v2.jpg">
Заметь index.html
не имеет Expires: <6 years>
. Он получает 304 Not Modified
лечение. Когда вы меняете один из ресурсов, вы увеличиваете его номер версии и меняете файлы .html, в которых он используется.
И вы получите лучшее из обоих миров.
Ничего не делай. У Apache уже есть ожидаемое из коробки поведение.
Когда браузер делает запрос URL-адреса, который он уже видел и кэшировал, и пользователь явно не заставляет перезагрузку, он включает If-Modified-Since
заголовок с меткой времени предыдущего запроса. Если сервер определяет, что актив не изменился с момента If-Modified-Since
отметка времени, тогда он просто отвечает 304 Not Modified
. (В дополнение к отметкам времени есть еще один заголовок, называемый ETag
используется для проверки действительности кеша, который работает путем сравнения хэшей содержимого, но это ничего не добавляет к этому обсуждению.)
Единственный раз, когда вы хотите использовать любой из mod_expires
features - это когда вы хотите указать браузеру, чтобы он не беспокоился о выполнении HTTP-запроса, чтобы проверить, обновлен ли кэшированный ресурс в течение некоторого периода времени. Например, у вас может быть схема, в которой ваш файл CSS расположен по адресу /style.1.css
, и вы называете его последующие версии как /style.2.css
, /style.3.css
и т. д. В этом случае вы могли бы полностью сэкономить накладные расходы на HTTP-запрос, установив Expires
заголовок.
То, что вы описываете как желаемое, - это то, как любой современный веб-сервер работает по умолчанию.
если ты не отправлять явные заголовки cache / expires (или если вы отправляете заголовки etag) каждый раз, когда пользователь запрашивает страницу / актив (asset = js, css, images и т. д.), браузер отправляет запрос на ваш сервер. Из вашего описания это желаемое поведение - вы хотите, чтобы браузер всегда запрашивал страницу / ресурс и получал либо обновленный контент, либо 304 Not Modified
пустой ответ, указывающий, что то, что пользователь ранее кэшировал, является последней версией.
Поэтому вы хотите удалить все добавленные вами заголовки, чтобы apache основывал свой ответ (только) на последнем измененном заголовке.
Что касается того, почему вам нужно другое поведение:
Вышеуказанное подходит для html-страниц, но неэффективно для типов контента, которые меняются редко или где вы можете просто изменить URL-адрес при изменении контента. Отправка запроса на ваш сервер и получение 304 Not Modified
ответ платный - он занимает время (в зависимости от того, сколько ресурсов находится на странице - это может быть много времени) и создает нагрузку на сервер (да, обработка большого количества запросов на статические ресурсы может значительно повлиять на производительность сервера) , так что это плохо для пользователя и плохо для вас. Вот почему вы хотите добавить заголовки с длинным сроком действия и использовать кэширование где это возможно, свести http-запросы к минимуму, но при этом вынудить пользователей повторно загружать ресурсы, когда они действительно меняются.
Есть отличное руководство по .htaccess Доступна с проект html5boilerplate. Подробно рассказывается, как оптимизировать (кэшировать) заголовки для повышения производительности и удобства работы пользователей. Однако не стоит зацикливаться на деталях: просто отбросьте по умолчанию .htaccess в корне вашего документа и убедитесь, что он делает то, что вы ожидаете. Конфигурация по умолчанию должна делать именно то, что вы хотите, с дополнительным преимуществом добавления оптимальных заголовков кеша для статических ресурсов. Если ваш вопрос на самом деле касался не html-контента, а другого типа контента - прочтите ссылки, прежде чем просто отключить всю полезную работу, которую логика кеширования в файле .htaccess делает за вас;)