HTACCESS правило кэширования изображений, которое проверяет время модификации изображения - PullRequest
3 голосов
/ 05 февраля 2012

Я обслуживаю изображения двумя разными способами:

  1. Использование сценария PHP для изображений профиля, например
  2. Указывая на них напрямую, например, на иконки и фон

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

Для сценария PHP я просто добавляю к ответу заголовок Last-Modified и доставляю 304 status code, если он вызывается снова, , если файл не изменился (с использованием filemtime()).

Для прямого доступа я использую HTACCESS, но каждое правило, которое я видел до сих пор, не позволяет мне делать то же самое, что и в моем скрипте PHP (проверка, изменился ли файл, затем обслуживание 304 или самого файла). ).

Вот правило HTACCESS, которое я планирую использовать:

Header unset Pragma
FileETag None
Header unset ETag

# cache images/pdf docs for 10 days
<FilesMatch "\.(ico|pdf|jpg|jpeg|png|gif)$">
  Header set Cache-Control "max-age=864000, public, must-revalidate"
  Header unset Last-Modified
</FilesMatch>

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

Ответы [ 3 ]

2 голосов
/ 06 февраля 2012

Вы можете использовать mod_expires , если доступно:

<FilesMatch "\.(ico|pdf|jpg|jpeg|png|gif)$">
  ExpiresDefault "modification plus 10 days"
</FilesMatch>
1 голос
/ 25 февраля 2012

Как отметил @Gumbo, «Apache уже должен делать это для статических файлов».И это правда, Apache делает это, так что такие вещи работают нормально:

<FilesMatch "\.(ico|pdf|jpg|jpeg|png|gif)$">
    Header set Cache-Control "max-age=864000, public, must-revalidate"
</FilesMatch>

ps: Извините @Gumbo, но я попросил вас изменить свой ответ, чтобы я мог принять его, но вы не сделали быэто и я должен был закрыть этот вопрос в конце концов, так что.

1 голос
/ 05 февраля 2012

То, что вы делаете с PHP, должно автоматически делать apache для статических файлов.Он установит заголовок Last-Modified и ответит 304, если найдет if-Modified-Since в запросе.Это делается автоматически и не имеет ничего общего с кэшированием.Это не помешает повторным запросам к вашему серверу, оно просто сэкономит вам пропускную способность (и время загрузки для пользователя), когда файл не изменяется, возвращая только 304 информации вместо всего файла.

Чтобы предотвратить повторениезапросы к вашему серверу, браузеру (и прокси-серверам) должны выполнять некоторое кэширование.Вы можете управлять кэшированием либо через заголовки HTTP, либо для HTML, а также через теги META.Когда вы указываете, что файл кэшируется в течение 1 недели, браузер не будет пытаться связаться с вашим сервером в течение 1 недели (хотя большинство браузеров настроены на повторную проверку записей кэша при первом доступе после запуска).

Таким образом, вы будетелибо живите с возможностью того, что некоторые пользователи будут использовать старую кэшированную копию в течение некоторого времени (зависит от заголовка срока действия), либо вы должны изменить свой URL, как предложил Гербен.Только тогда вы можете быть на 100% уверены, что все получат новую версию (это важно для javascript, поскольку некоторые js-файлы старые, а некоторые новые могут привести к очень странным ошибкам).В настоящее время почти каждый высокопроизводительный веб-сайт использует подход file.ext?v=3, так что они могут установить для заголовка истечения большие значения, например, 6 месяцев.

...