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

Как истечь срок действия изображения и принудительно перезагрузить в Apache только при изменении файла на сервере

У меня есть приложение PHP, работающее на сервере Apache2. Я начал с HTML5 Boilerplate, а .htaccess включает политику истечения срока действия «1 месяц» для всех изображений. Например:

ExpiresByType image/jpeg                            "access plus 1 month"

Мое приложение также позволяет пользователю заменять существующее изображение новым (с тем же именем и путем). Однако после замены пользователь продолжает видеть старое изображение, пока страница не будет обновлена ​​принудительно (скажем, Ctrl-F5).

Из журналов я заметил, что технически, поскольку срок действия изображения истекает через 1 месяц, браузер не запрашивает его у сервера. Только при принудительном обновлении браузер запрашивает его, и в этот момент Apache2 может выдать 304 (если файл никогда не менялся) или отправьте новое изображение с 200 (если изменилось).

Мне нужен простой и понятный механизм:

Как альтернатива, Я бы не возражал, если бы я мог условно установить политику истечения срока действия как «немедленную» только для определенного пути (изображения в других папках должны соответствовать общей политике истечения срока действия). Я могу жить с многочисленными 304с. Я думаю.

Я не хочу просто менять имя файла на новое. Имена файлов генерируются динамически, а их несколько - отслеживание их «новых имен» добавит сложности. (Хотя, если нет другого простого решения, мне придется это изучить.)

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

  • Если 304 не повредили вам: сокращение интервала может быть решением
  • Популярные способы устранения этой проблемы включают параметр отметки времени для изображения: Не загружать logo.pngскорее груз logo.png?t=20160327083700 где временная метка либо статична для всего вашего приложения (и обновляется по вашему усмотрению), либо дата последнего изменения файла (что добавит нагрузку на сервер)
  • После вашего комментария вы также можете добавить метку времени в другом месте пути (чтобы имена ваших изображений остались прежними): /20160327083700/logo.png. Однако прочтите мой последний абзац о преждевременной оптимизации.

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

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

Изменить: как вы указываете в комментарии, браузеры обычно интерпретируют ? в URL-адресе в качестве обхода кеша - и лучше запросить ресурс снова пораньше. При этом лучшим вариантом может быть сокращение промежутка времени. Особенно когда вы говорите, что переживете 304-е годы: "access plus 1 hour" (а то и 10 минут). В любом случае это было бы правильно: который контент можно кешировать на 1 месяц если и только если его можно кешировать на 1 месяц.

И, кстати, позвольте мне напомнить вам старую поговорку «преждевременная оптимизация - корень всех зол» - держу пари, "access plus 1 month" возникло не из сеанса настройки производительности, а скорее из вашего предположения. И, как вы видите в этом вопросе, эта преждевременная оптимизация на самом деле вызывает много дополнительной работы по разрешению возникших конфликтов.