У меня есть приложение PHP, работающее на сервере Apache2. Я начал с HTML5 Boilerplate, а .htaccess
включает политику истечения срока действия «1 месяц» для всех изображений. Например:
ExpiresByType image/jpeg "access plus 1 month"
Мое приложение также позволяет пользователю заменять существующее изображение новым (с тем же именем и путем). Однако после замены пользователь продолжает видеть старое изображение, пока страница не будет обновлена принудительно (скажем, Ctrl-F5).
Из журналов я заметил, что технически, поскольку срок действия изображения истекает через 1 месяц, браузер не запрашивает его у сервера. Только при принудительном обновлении браузер запрашивает его, и в этот момент Apache2 может выдать 304
(если файл никогда не менялся) или отправьте новое изображение с 200
(если изменилось).
Мне нужен простой и понятный механизм:
Как альтернатива, Я бы не возражал, если бы я мог условно установить политику истечения срока действия как «немедленную» только для определенного пути (изображения в других папках должны соответствовать общей политике истечения срока действия). Я могу жить с многочисленными 304
с. Я думаю.
Я не хочу просто менять имя файла на новое. Имена файлов генерируются динамически, а их несколько - отслеживание их «новых имен» добавит сложности. (Хотя, если нет другого простого решения, мне придется это изучить.)
Вы просите многого: явно настраиваете, что некоторые данные действительны в течение месяца, только тогда это не сразу, как только вы передумаете. В общем, придется решиться.
logo.png
скорее груз logo.png?t=20160327083700
где временная метка либо статична для всего вашего приложения (и обновляется по вашему усмотрению), либо дата последнего изменения файла (что добавит нагрузку на сервер)/20160327083700/logo.png
. Однако прочтите мой последний абзац о преждевременной оптимизации.Пока вы говорите всем, что ресурс действителен в течение длительного времени, не удивляйтесь, что они верят вам на слово и повторно используют его, пока время не истечет.
Для параметра отметки времени выше я использовал несколько читаемую отметку времени (например, сегодня). Вероятно, вы захотите просто использовать неформатированные миллисекунды с 1970 года или любое неформатированное значение, которое вы легко получите. Его просто нужно менять при каждом обновлении файла.
Изменить: как вы указываете в комментарии, браузеры обычно интерпретируют ?
в URL-адресе в качестве обхода кеша - и лучше запросить ресурс снова пораньше. При этом лучшим вариантом может быть сокращение промежутка времени. Особенно когда вы говорите, что переживете 304-е годы: "access plus 1 hour"
(а то и 10 минут). В любом случае это было бы правильно: который контент можно кешировать на 1 месяц если и только если его можно кешировать на 1 месяц.
И, кстати, позвольте мне напомнить вам старую поговорку «преждевременная оптимизация - корень всех зол» - держу пари, "access plus 1 month"
возникло не из сеанса настройки производительности, а скорее из вашего предположения. И, как вы видите в этом вопросе, эта преждевременная оптимизация на самом деле вызывает много дополнительной работы по разрешению возникших конфликтов.