Cache Expire Control с последней модификацией

в Apache mod_expires модуль, есть Expires директива с двумя базовыми периодами времени,открыть и модификации.

ExpiresByType text/html "access plus 30 days"

по понятным причинам означает, что кэш будет запрашивать свежий контент через 30 дней.

,
ExpiresByType text/html "modification plus 2 hours"

не поняли.

как кэш браузера знает, что файл был изменен, если он не делает запрос на сервер? И если это делает вызовите сервер, какой смысл кэшировать эту директиву? Мне кажется, что я не понимаю какую-то важную часть кэширования. Пожалуйста, просветите меня.

4 ответов


An 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 GMT, браузер кэширует страницу, потому что она еще не истек. Так что если пользователь впервые посещает страницу в 11:00 GMT, а затем снова переходит на ту же страницу в 11:30 GMT, браузер увидит, что его кэшированная версия по-прежнему действительна и не будет (или, скорее, не разрешено) делать новый 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.

(заметим, конечно, что многие другие вещи отправляются вместе с двумя заголовками, которые я перечислил выше, я просто обрезал все остальное для простоты)


сервер отправляет заголовок, например: "Last-Modified: Wed, 18 Feb 2009 00:00:00 GMT". Кэш ведет себя на основе этого заголовка или времени доступа.

скажем, если ожидается, что контент будет обновляться каждый день, то вы хотите, чтобы он истек "модификация плюс 24 часа".

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


Я понимаю, что модификация просит браузер основывать время кэша на основе значения последнего измененного HTTP-заголовка. Так, модификация Plus 2 часов будет последним-Modificatied времени + 2 часа.


прежде всего, спасибо Дэвиду Z за подробное объяснение выше. В ответ на вопрос бушмена о том, почему имеет смысл вызывать кэширование, если сервер все еще требуется сделать запрос, ответ заключается в том, что время сохраняется в том, что возвращается сервером. Если директивы кэша указывают, что содержимое файла по-прежнему свежо, вместо возврата содержимого возвращается код 304 с пустым телом ответа. Вот где экономится время.

лучше объяснение, которое я дал здесь, от https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers:

хотя условные запросы вызывают вызов по сети, немодифицированные ресурсы приводят к пустому телу ответа – экономя затраты на передачу ресурса обратно конечному клиенту. Серверная служба также часто может очень быстро определить последнюю дату изменения ресурса без доступа к ресурс, который сам экономит нетривиальное время обработки.

времени

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

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

кэш-контроль: public, max-age=31536000 Последнее изменение: Пн, 03 янв 2011 17:45: 57 GMT

в следующий раз, когда браузер запрашивает этот ресурс, он будет запрашивать только содержимое ресурса, если они не изменились с этой даты, используя заголовок запроса If-Modified-Since

If-Modified-Since: Mon, 03 янв 2011 17:45: 57 GMT

Если ресурс не изменился с пн, 03 янв 2011 17: 45: 57 GMT сервер будет возврат с пустым телом с кодом ответа 304.