Server response 304 Not Modified
HTTP статус-код 304 (Not Modified)
HTTP статус-код 304 (Not Modified) — это ответ сервера, который указывает на то, что запрашиваемый ресурс не изменился с момента последнего запроса клиента. Этот код используется в целях оптимизации кэширования, что позволяет избежать передачи неизменённых данных, тем самым уменьшая время загрузки и трафик.
Основные характеристики статус-кода 304
Определение и назначение
Статус-код 304 сообщает клиенту, что запрашиваемый ресурс не изменился с момента последнего запроса. Это позволяет клиенту использовать локально сохранённую версию ресурса вместо повторной загрузки с сервера.
Как работает механизм кэширования с использованием 304
Когда клиент (например, браузер) запрашивает ресурс, он может отправить дополнительные заголовки, такие как If-Modified-Since или If-None-Match. Сервер проверяет, был ли ресурс изменён с указанного момента или соответствует ли он заданному эталону. Если изменений не произошло, сервер возвращает статус 304, что позволяет клиенту использовать кэшированную версию.
Условия, при которых сервер возвращает статус 304
- Если ресурс не изменялся с момента последнего запроса.
- Если клиент отправил заголовки If-Modified-Since или If-None-Match, и сервер подтвердил, что ресурс остался прежним.
Практические примеры использования статус-кода 304
Пример с кэшированием изображений на веб-сайте
Веб-браузеры часто кэшируют изображения для ускорения загрузки страниц. При повторном запросе изображения браузер может отправить заголовок If-Modified-Since с датой последнего получения изображения. Если сервер определит, что изображение не изменялось, он вернёт статус 304.
Как браузер сохраняет кэш
Браузеры сохраняют кэшированные ресурсы в локальной памяти, что позволяет им быстро загружать страницы без необходимости повторных запросов к серверу.
Поведение при повторном запросе
Если браузер отправляет запрос с заголовком If-Modified-Since и сервер возвращает 304, браузер использует уже загруженную версию изображения.
Пример с API
Статус 304 может использоваться для оптимизации запросов к API, позволяя клиенту получать обновлённые данные только в случае их изменения.
Пример с заголовками If-Modified-Since и If-None-Match
Эти заголовки позволяют клиенту указывать, когда он в последний раз получал ресурс, и серверу принимать решение о необходимости передачи данных.
Как исправить проблемы с кодом 304 на разных языках программирования
PHP
Для корректной работы с 304 статусом в PHP необходимо правильно установить заголовки для кэширования.
header("Last-Modified: " . gmdate("D, d M Y H:i:s", $last_modified_time) . " GMT");
if (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time) {
header("HTTP/1.1 304 Not Modified");
exit();
}
Python (Flask)
В Flask можно настроить кэширование и обработку статуса 304 с помощью декораторов и заголовков.
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/resource')
def resource():
response = make_response("Your resource content")
response.headers['Last-Modified'] = last_modified_time
if request.headers.get('If-Modified-Since') == last_modified_time:
return '', 304
return response
Node.js (Express)
В Express можно обрабатывать запросы с использованием статуса 304 через middleware.
const express = require('express');
const app = express();
app.get('/resource', (req, res) => {
const lastModified = new Date(last_modified_time).toUTCString();
res.set('Last-Modified', lastModified);
if (req.headers['if-modified-since'] === lastModified) {
return res.status(304).end();
}
res.send('Your resource content');
});
Часто встречающиеся ошибки и способы их устранения
Неправильная настройка кэширования на сервере
Убедитесь, что сервер правильно настраивает заголовки кэширования и последний модификации ресурса.
Ошибки в заголовках запроса
Проверьте, отправляются ли заголовки If-Modified-Since и If-None-Match корректно.
Как проверить и отладить статус 304
Используйте инструменты разработчика в браузере для анализа сетевых запросов и ответов. Также проверьте логи сервера для выявления причин возврата статуса 304.