Ответ сервера 304 Not Modified
HTTP статус-код 304 (Not Modified)
HTTP статус-код 304 (Not Modified) указывает на то, что запрашиваемый ресурс не изменился после последнего запроса клиента. Этот код играет ключевую роль в механизме кэширования, позволяя сократить объем передаваемых данных и улучшить производительность веб-приложений.
Основные характеристики статус-кода 304
- Определение и назначение: Код 304 сообщает клиенту, что он может использовать кэшированную версию ресурса, поскольку сервер не обнаружил изменений.
- Как работает механизм кэширования с использованием 304: Клиент (например, браузер) сохраняет копию ресурса. При следующем запросе он отправляет заголовки, указывающие серверу, что он хочет проверить обновления.
- Условия, при которых сервер возвращает статус 304: Сервер возвращает код 304, если ресурс не изменился и если клиент отправил заголовки
If-Modified-Since
илиIf-None-Match
.
Практические примеры использования статус-кода 304
- Пример с кэшированием изображений на веб-сайте:
- Браузер сохраняет изображения в кэш, чтобы не загружать их повторно при каждом запросе.
- При повторном запросе браузер отправляет заголовок
If-Modified-Since
, и если изображение не изменилось, сервер возвращает статус 304.
- Пример с API:
- Клиент делает запрос к API и получает данные вместе с заголовками кэширования.
- При следующем запросе клиент включает заголовок
If-None-Match
, и сервер возвращает статус 304, если данные не изменились.
- Пример с заголовками If-Modified-Since и If-None-Match:
- Заголовок
If-Modified-Since
позволяет серверу проверить дату последнего изменения ресурса. - Заголовок
If-None-Match
работает с ETag, уникальным идентификатором версии ресурса.
- Заголовок
Как исправить проблемы с кодом 304 на разных языках программирования
PHP
- Как правильно установить заголовки для кэширования: Используйте функции
header()
для установки необходимых заголовков. - Пример кода для обработки запросов и возврата статуса 304:
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { $lastModified = 'Tue, 01 Jan 2023 00:00:00 GMT'; // Пример даты if (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= strtotime($lastModified)) { header('HTTP/1.1 304 Not Modified'); exit(); } } header('Last-Modified: '.$lastModified);
Python (Flask)
- Как настроить кэширование и обработку статуса 304: Используйте библиотеку Flask для обработки запросов с кэшированием.
- Пример кода для проверки условий кэширования:
from flask import Flask, request, make_response app = Flask(__name__) @app.route('/resource') def resource(): last_modified = 'Tue, 01 Jan 2023 00:00:00 GMT' response = make_response("Resource content") response.headers['Last-Modified'] = last_modified if request.headers.get('If-Modified-Since') == last_modified: return '', 304 return response
Node.js (Express)
- Как обрабатывать запросы с использованием статуса 304: В Express используйте middleware для проверки заголовков.
- Пример кода для работы с заголовками If-Modified-Since:
const express = require('express'); const app = express(); app.get('/resource', (req, res) => { const lastModified = new Date('2023-01-01T00:00:00Z'); res.set('Last-Modified', lastModified.toUTCString()); if (req.headers['if-modified-since'] === lastModified.toUTCString()) { return res.status(304).end(); } res.send('Resource content'); }); app.listen(3000);
Часто встречающиеся ошибки и способы их устранения
- Неправильная настройка кэширования на сервере: Убедитесь, что заголовки кэширования установлены корректно.
- Ошибки в заголовках запроса: Проверьте, правильно ли указаны заголовки
If-Modified-Since
иIf-None-Match
. - Как проверить и отладить статус 304: Используйте инструменты разработчика в браузере для анализа сетевых запросов и ответов.
Заголовок | Описание |
---|---|
If-Modified-Since | Указывает дату последнего изменения ресурса, которую клиент использует для проверки обновлений. |
If-None-Match | Сравнивает ETag ресурса с указанным значением для определения необходимости обновления. |
Last-Modified | Указывает дату последнего изменения ресурса на сервере. |