Контроль истечения срока действия кэша с последней модификацией
В модуле Apache mod_expires
существует директива Expires
с двумя базовыми периодами времени, доступ и модификация.
ExpiresByType text/html "access plus 30 days"
понятно, что кэш будет запрашивать свежий контент через 30 дней.
Однако
ExpiresByType text/html "modification plus 2 hours"
не имеет интуитивного смысла.
Как кеш браузера знает, что файл был изменен, если он не делает запрос на сервер? И если он обращается к серверу, каково использование кэширования этой директивы? Мне кажется, что я не понимаю ключевую часть кеширования. Пожалуйста, просветите меня.
Ответы
Ответ 1
Директива Expires*
с "модификацией" в качестве базы относится к времени модификации файла на сервере. Поэтому, если вы установите, скажем, "модификацию плюс 2 часа", любой браузер, который запрашивает контент в течение 2 часов после изменения файла (на сервере), будет кэшировать этот контент до 2 часов после изменения времени файла. И браузер знает, когда это время, потому что сервер отправляет заголовок Expires
с правильным временем истечения срока действия.
Позвольте мне объяснить с помощью примера: скажем, ваша конфигурация Apache включает в себя строку
ExpiresDefault modification plus 2 hours
и у вас есть файл index.html
, к которому применяется директива ExpiresDefault
, на сервере. Предположим, вы загрузили версию index.html
в 9:53 GMT, перезаписав предыдущую существующую index.html
(если она была). Итак, теперь время модификации index.html
равно 9:53 GMT. Если вы выполняли ls -l
на сервере (или dir
в Windows), вы увидите его в списке:
-rw-r--r-- 1 apache apache 4096 Feb 18 09:53 index.html
Теперь, с каждым запросом, Apache отправляет заголовок Last-Modified
с последним временем модификации файла. Поскольку у вас есть эта директива ExpiresDefault
, она также отправит заголовок Expires
с временем, равным времени модификации файла (9:53) плюс два часа. Итак, вот часть того, что видит браузер:
Last-Modified: Wed, 18 Feb 2009 09:53:00 GMT
Expires: Wed, 18 Feb 2009 11:53:00 GMT
Если время, в которое браузер делает этот запрос, находится до 11:53 по Гринвичу, браузер будет кэшировать страницу, потому что он еще не истек. Поэтому, если пользователь сначала посещает страницу в 11:00 по Гринвичу, а затем снова переходит на ту же страницу в 11:30 по Гринвичу, браузер увидит, что ее кешированная версия все еще действительна и не будет (или, скорее, разрешена не ) сделать новый HTTP-запрос.
Если пользователь переходит на страницу в третий раз в 12:00 GMT, браузер видит, что его кешированная версия истек (после 11:53), поэтому он пытается проверить страницу, отправив запрос на сервер с заголовком If-Modified-Since. 304 (не измененный) ответ без тела будет возвращен, так как дата страницы не была изменена с момента ее первой подачи. Поскольку дата истечения срока действия прошла - страница "устарела" - запрос валидации будет производиться каждый последующий раз, когда страница посещается до тех пор, пока проверка не завершится с ошибкой.
Теперь сделайте вид, что вы загрузили новую версию страницы в 11:57. В этом случае браузер пытается проверить старую версию страницы в 12:00 с ошибкой и получает в ответ вместе с новой страницей эти два новых заголовка:
Last-Modified: Wed, 18 Feb 2009 11:57:00 GMT
Expires: Wed, 18 Feb 2009 13:57:00 GMT
(Последнее время модификации файла становится 11:57 при загрузке новой версии, а Apache рассчитывает время истечения как 11:57 + 2:00 = 13:57 GMT.)
Валидация (с использованием более поздней даты) не требуется до 13:57.
(Обратите внимание, конечно, что многие другие вещи отправляются вместе с двумя заголовками, перечисленными выше, я просто упростил все остальное для простоты)
Ответ 2
Сервер отправляет заголовок, например: "Last-Modified: Wed, 18 Feb 2009 00:00:00 GMT
". Кэш ведет себя на основе этого заголовка или времени доступа.
Скажите, будет ли контент обновляться каждый день, тогда вы хотите, чтобы он истекал "модификация плюс 24 часа".
Если вы не знаете, когда содержимое будет обновлено, тогда лучше всего установить его на время доступа.
Ответ 3
Я понимаю, что модификация требует, чтобы браузер основывал время кэширования на основе значения HTTP-заголовка Last-Modificatied. Таким образом, модификация плюс 2 часа будет Last-Modificatied time + 2 часа.
Ответ 4
Прежде всего, спасибо David Z за подробное объяснение выше. В ответ на вопрос о том, почему имеет смысл ссылаться на кеширование, если сервер по-прежнему требуется сделать запрос, ответ заключается в том, что время сохраняется в том, что возвращается сервером. Если директивы кэша указывают, что содержимое файла все еще свежо, вместо возврата содержимого возвращается код 304 с пустым телом ответа. Вот где время сохраняется.
Лучшее объяснение, чем я дал здесь, от https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers:
Хотя условные запросы вызывают вызов по сети, немодифицированные ресурсы приводят к пустующему телу ответа - сохранение стоимости передачи ресурса обратно конечному клиенту. Бэкэнд-сервис также часто может очень быстро определять ресурс последней измененной даты без доступа к ресурсу, который сам сохраняет нетривиальное время обработки.
на основе времени
Временной запрос, основанный на времени, гарантирует, что только если запрошенный ресурс изменился с момента кэширования копии браузера, содержимое будет передано. Если кешированная копия является самой последней, тогда сервер возвращает код ответа 304.
Чтобы включить условные запросы, приложение указывает последнее измененное время ресурса через заголовок ответа Last-Modified.
Cache-Control: public, max-age = 31536000 Последнее изменение: Пн, 03 Янв. 2011 17:45:57 GMT
В следующий раз, когда браузер запросит этот ресурс, он будет запрашивать только содержимое ресурса, если они не изменились с этой даты, используя заголовок запроса If-Modified-Since
If-Modified-Since: Пн, 03 Янв. 2011 17:45:57 GMT
Если ресурс hasnt изменился с понедельника, 03 янв. 2011 17:45:57 GMT сервер вернется с пустым телом с кодом ответа 304.
Ответ 5
Если вы думаете об этом, большинство людей должны использовать модификацию плюс, а не использовать доступ плюс, так как вы хотите, чтобы ваши страницы/файлы/изображения загружались сразу после внесения изменений, и если вы не вносили никаких изменений, вы получите кэшированные страницы/файлы/изображения до тех пор, пока вы вносите изменения. Не нужно угадывать, как часто вы вносите изменения для каждого.
Я прав с этим?
Так почему же я не вижу, чтобы многие говорили об использовании модификации в Интернете?
Если кто-нибудь знает минусы использования модификации плюс, пожалуйста, дайте мне знать. Потому что с этого момента я собираюсь начать использовать модификацию плюс.