
Заголовок If-Modified-Since позволяет серверу экономить трафик и ускорять загрузку страниц, возвращая содержимое только при изменении ресурса с указанной даты. Он активно используется в HTTP/1.1 и поддерживается всеми современными веб-серверами и браузерами.
Для правильной работы заголовка важно, чтобы сервер корректно определял дату последнего изменения файла. В Apache это настраивается через директиву FileETag и проверку временных меток файлов, а в Nginx – через директиву add_header Last-Modified. Без этих настроек запросы с If-Modified-Since будут игнорироваться, и сервер всегда будет отправлять полный ответ.
Использование заголовка в скриптах, например на PHP, требует явной проверки $_SERVER[‘HTTP_IF_MODIFIED_SINCE’] и сравнения с временем последнего изменения ресурса. При совпадении сервер должен возвращать статус 304 Not Modified, что снижает нагрузку на сеть и ускоряет отклик.
Неправильная настройка может привести к кешированию устаревших версий файлов или постоянной передаче данных, что особенно критично для динамического контента и больших медиа-файлов. Контроль логов и тестирование запросов с заголовком If-Modified-Since позволяют выявить и исправить такие ошибки до их влияния на пользователей.
Что такое заголовок If Modified Since и зачем он нужен
Заголовок If-Modified-Since используется в HTTP-запросах для указания даты последнего получения ресурса. Сервер сверяет эту дату с временем последнего изменения файла и, если изменений нет, возвращает статус 304 Not Modified, не отправляя содержимое.
Основные цели применения заголовка:
- Сокращение трафика при повторных запросах неизменившихся ресурсов.
- Ускорение загрузки страниц за счет исключения передачи больших файлов.
- Снижение нагрузки на сервер при обслуживании массовых запросов.
Рекомендации по настройке:
- На Apache необходимо выставить корректные директивы FileETag и Last-Modified для учета временных меток файлов.
- В Nginx использовать add_header Last-Modified для указания даты изменения ресурсов.
- В PHP проверять $_SERVER[‘HTTP_IF_MODIFIED_SINCE’] и возвращать статус 304, если файл не изменился.
Особенно полезен заголовок для статических файлов, изображений и скриптов, где повторная передача данных занимает значительный объем трафика. Правильная настройка ускоряет отклик сервера и уменьшает расход сетевых ресурсов.
Проверка поддержки If Modified Since на сервере
Для корректной работы заголовка If-Modified-Since сервер должен уметь определять дату последнего изменения файла и возвращать статус 304 Not Modified, если ресурс не изменился. Проверку можно выполнить с помощью HTTP-запросов или специализированных инструментов.
Способы проверки:
| Метод | Описание | Пример |
|---|---|---|
| cURL | Отправка запроса с заголовком If-Modified-Since и анализ ответа сервера | curl -I -H "If-Modified-Since: Wed, 17 Dec 2025 12:00:00 GMT" https://example.com/file.js |
| Браузерные инструменты | Использование вкладки Network в DevTools для проверки заголовков запроса и ответа | Открыть DevTools → Network → выбрать ресурс → проверить наличие Last-Modified и статус 304 |
| Онлайн-сервисы | Сервисы проверки HTTP-заголовков позволяют увидеть реакцию сервера на If-Modified-Since | Например, https://httpstatus.io/ |
Рекомендации:
- Убедиться, что сервер выставляет корректный заголовок Last-Modified для всех проверяемых ресурсов.
- Проверять реакцию как на недавно измененные, так и на неизменившиеся файлы.
- Для динамического контента использовать скриптовую проверку времени изменения и возврат 304 при отсутствии изменений.
Настройка заголовка в Apache через .htaccess
Для корректной работы If-Modified-Since на Apache необходимо, чтобы сервер выставлял заголовок Last-Modified и учитывал временные метки файлов. Основной инструмент – файл .htaccess.
Пример базовой настройки:
FileETag MTime Size – включение тегов для учета времени изменения и размера файла при формировании ETag.
Настройка заголовка Last-Modified для определенных типов файлов:
<FilesMatch "\.(js|css|jpg|png|gif)$">
Header set Last-Modified "%{FILE_LAST_MODIFIED}e" env=FILE_LAST_MODIFIED
</FilesMatch>
Рекомендации:
- Использовать директиву FileETag для корректного формирования ETag и правильной работы If-Modified-Since.
- Настраивать заголовок Last-Modified для всех статических ресурсов, особенно для изображений, скриптов и стилей.
- Проверять работу через cURL или DevTools, чтобы убедиться, что сервер возвращает 304 Not Modified при отсутствии изменений.
Настройка заголовка в Nginx через конфигурацию сервера

В Nginx поддержка If-Modified-Since реализуется через директивы, которые задают заголовок Last-Modified и управляют кешированием статических файлов. Это позволяет серверу возвращать статус 304 Not Modified без передачи содержимого при отсутствии изменений.
Пример конфигурации для статических файлов:
location ~* \.(js|css|png|jpg|gif)$ {
root /var/www/html;
expires 30d;
add_header Last-Modified $date_gmt;
add_header Cache-Control "public";
}
Рекомендации по настройке:
- Использовать директиву add_header Last-Modified для всех статических ресурсов.
- Настроить expires и Cache-Control для управления кешированием на стороне клиента.
- Проверять работу через инструменты DevTools или cURL, чтобы убедиться, что при неизменном файле сервер возвращает 304.
- Для динамических файлов предусмотреть генерацию заголовка Last-Modified в скриптах и корректный возврат статуса 304.
Использование If Modified Since в PHP-скриптах

PHP позволяет обрабатывать заголовок If-Modified-Since и возвращать статус 304 Not Modified, если ресурс не изменился. Это снижает нагрузку на сервер и экономит трафик.
Пример проверки файла:
$file = 'example.js';
$lastModified = filemtime($file);
$ifModifiedSince = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) : false;
if ($ifModifiedSince && $ifModifiedSince >= $lastModified) {
header('HTTP/1.1 304 Not Modified');
exit;
}
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
readfile($file);
Рекомендации:
- Использовать filemtime для получения времени последнего изменения файла.
- Сравнивать дату из $_SERVER[‘HTTP_IF_MODIFIED_SINCE’] с временем изменения файла.
- Возвращать 304 Not Modified только если ресурс не изменился, иначе отправлять содержимое с заголовком Last-Modified.
- Для динамического контента формировать временную метку последнего изменения на основе данных из базы или кэш-файлов.
Тестирование правильности работы заголовка

Для проверки корректной работы заголовка If-Modified-Since необходимо убедиться, что сервер возвращает статус 304 Not Modified для неизменившихся ресурсов и передает содержимое при изменении файла.
Методы тестирования:
- Использование cURL для отправки запроса с заголовком If-Modified-Since:
curl -I -H "If-Modified-Since: Wed, 17 Dec 2025 12:00:00 GMT" https://example.com/file.js - Проверка через DevTools в браузере: вкладка Network показывает статус ответа, заголовки Last-Modified и If-Modified-Since.
- Сравнение временных меток файлов на сервере с датой в заголовке запроса для проверки точности.
Рекомендации:
- Проверять как статические, так и динамические ресурсы, чтобы убедиться в корректной генерации заголовка на уровне скриптов.
- Тестировать с различными клиентами, включая мобильные браузеры и API-клиенты, чтобы исключить несовместимости.
- Для массовых файлов использовать автоматизированное тестирование запросов с If-Modified-Since, чтобы выявить ресурсы, которые всегда возвращают полный ответ.
Логирование запросов с If Modified Since

Логирование запросов с заголовком If-Modified-Since помогает отслеживать использование кеширования и выявлять ресурсы, которые постоянно запрашиваются повторно. Это позволяет оптимизировать настройку сервера и уменьшить нагрузку.
Типичные ошибки и способы их устранения
Неправильная настройка заголовка If-Modified-Since может привести к постоянной передаче ресурсов, устаревшему кешу или некорректной работе динамических файлов.
Основные ошибки и рекомендации:
- Отсутствие заголовка Last-Modified: сервер всегда возвращает полный ответ. Решение: включить директиву Last-Modified в конфигурации сервера или скриптов.
- Неправильные временные метки файлов: ресурс считается изменившимся даже без изменений. Решение: использовать filemtime или корректно настраивать ETag через FileETag.
- Динамический контент без учета времени изменения: статус 304 никогда не возвращается. Решение: формировать Last-Modified на основе времени последнего изменения данных или кэш-файлов.
- Клиент игнорирует заголовок: кэширование на стороне браузера не работает. Решение: проверять совместимость через DevTools и при необходимости использовать директивы Cache-Control и Expires.
- Несоответствие формата даты: сервер не распознает If-Modified-Since. Решение: всегда использовать формат GMT, например: D, d M Y H:i:s GMT.
Вопрос-ответ:
Что такое заголовок If-Modified-Since и для чего он нужен?
Заголовок If-Modified-Since используется в HTTP-запросах для проверки, изменялся ли ресурс на сервере с определённой даты. Если ресурс не изменился, сервер возвращает код 304 (Not Modified), что позволяет экономить трафик и ускоряет загрузку страниц, так как клиент получает данные из кеша.
Как включить поддержку If-Modified-Since на Apache сервере?
На Apache нужно убедиться, что включён модуль mod_headers и mod_expires. В конфигурационном файле можно использовать директиву Header для установки Last-Modified, а браузер автоматически отправляет If-Modified-Since при повторных запросах. Также важно настроить правильные даты изменения файлов, чтобы сервер корректно реагировал на условный запрос.
Можно ли использовать If-Modified-Since для динамических страниц?
Да, но с оговорками. Для динамического контента сервер должен сам отслеживать дату последнего изменения данных и включать её в заголовок Last-Modified. Если сервер не обновляет дату корректно, клиент может получать устаревший кеш. Для динамических страниц иногда предпочтительнее использовать ETag, который даёт более точный контроль за изменениями.
Какие ошибки чаще всего возникают при настройке If-Modified-Since?
Чаще всего встречаются три проблемы: сервер не выставляет заголовок Last-Modified, дата выставлена неверно или не совпадает с фактическим временем изменения файла, и кеширование на стороне клиента мешает проверке. В результате браузер может запрашивать ресурс заново каждый раз или наоборот использовать устаревшую версию.
Как проверить работу If-Modified-Since на сервере?
Можно использовать curl или браузерные инструменты разработчика. Например, запрос через curl: curl -I -H "If-Modified-Since: Fri, 01 Jan 2021 00:00:00 GMT" https://example.com/file. Если ресурс не менялся, сервер вернёт код 304. В браузере можно смотреть вкладку Network и проверять заголовки Last-Modified и If-Modified-Since для конкретных файлов.
Что делает заголовок If-Modified-Since и как его применять на сервере?
Заголовок If-Modified-Since позволяет клиенту проверять, изменялся ли ресурс на сервере с указанной даты. Если ресурс не менялся, сервер отвечает кодом 304, и браузер использует кешированную версию. На сервере необходимо выставлять заголовок Last-Modified для файлов или ответов, чтобы клиент мог корректно использовать условные запросы. Для статических файлов это обычно делается автоматически, а для динамических ресурсов дату нужно генерировать программно.
Какие шаги нужны для проверки работы If-Modified-Since?
Для проверки можно использовать утилиты типа curl или встроенные инструменты браузера. Например, через curl отправляется запрос с заголовком: curl -I -H "If-Modified-Since: Fri, 01 Jan 2021 00:00:00 GMT" https://example.com/file. Если ресурс не изменялся с указанной даты, сервер вернёт 304. В браузере на вкладке Network можно смотреть заголовки Last-Modified и If-Modified-Since, чтобы убедиться, что условные запросы обрабатываются корректно.
