Contents

    Server response 304 Not Modified

    HTTP статус-код 304 (Not Modified)

    HTTP статус-код 304 (Not Modified) — это ответ сервера, который указывает на то, что запрашиваемый ресурс не изменился с момента последнего запроса клиента. Этот код используется в целях оптимизации кэширования, что позволяет избежать передачи неизменённых данных, тем самым уменьшая время загрузки и трафик.

    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.