Obsah

    Odpověď serveru 304 Not Modified

    HTTP status kód 304 (Not Modified)

    HTTP status kód 304 (Not Modified) je odpověď serveru, která indikuje, že požadovaný zdroj nebyl od posledního požadavku klienta změněn. Tento kód slouží k optimalizaci práce s cachingem, čímž se vyhýbá přenosu dat, která se nezměnila. Použití status kódu 304 je klíčové pro efektivní správu šířky pásma a zrychlení načítání stránek.

    304 - Not Modified

    1. Hlavní charakteristiky status kódu 304

    • Definice a účel: Status kód 304 informuje klienta, že jeho poslední verze požadovaného zdroje je stále aktuální a není třeba ji znovu stahovat.
    • Jak funguje mechanismus cachingu pomocí 304: Když klient poprvé požádá o zdroj, server mu pošle obsah spolu s hlavičkou, která obsahuje informace o poslední změně. Při následném požadavku klient posílá hlavičky jako If-Modified-Since nebo If-None-Match. Pokud se server shoduje, vrátí status 304.
    • Podmínky, za kterých server vrací status 304: Server vrátí tento status, pokud jsou splněny podmínky pro caching a obsah se od posledního požadavku nezměnil.

    2. Praktické příklady použití status kódu 304

    Příklad s cachováním obrázků na webové stránce

    Při načítání obrázků na webové stránce může prohlížeč uložit obrázky do cache. Při dalším načtení stránky prohlížeč znovu odešle požadavek na server, ale server může vrátit status 304, pokud se obrázek nezměnil.

    Jak prohlížeč ukládá cache

    Když prohlížeč obdrží odpověď s obrázkem poprvé, uloží ho do cache. Při dalším požadavku na tento obrázek prohlížeč odešle hlavičky, které obsahují informace o poslední změně obrázku.

    Chování při opakovaném požadavku

    Pokud se obrázek nezměnil, server vrátí status 304 a neodešle znovu obsah obrázku, což šetří šířku pásma.

    Příklad s API

    Status 304 může být také využit při práci s API. Pokud klient žádá o data, která se nezměnila od posledního požadavku, server může vrátit status 304 a tím minimalizovat přenos dat.

    Příklad se záhlavími If-Modified-Since a If-None-Match

    Klient může posílat záhlaví If-Modified-Since, které obsahuje datum poslední změny, nebo If-None-Match, které používá etag. Server porovná tyto hodnoty a pokud se shodují, vrátí status 304.

    3. Jak opravit problémy se statusem 304 v různých programovacích jazycích

    PHP

    • Jak správně nastavit záhlaví pro caching: Použijte funkce pro nastavení záhlaví, které informují prohlížeč o možnosti cachování.
    • Příklad kódu pro zpracování požadavků a vracení statusu 304:
                  <?php
                  header('Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT');
                  if (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == strtotime('Wed, 21 Oct 2023 07:28:00 GMT')) {
                      header('HTTP/1.1 304 Not Modified');
                      exit();
                  }
                  ?>
              

    Python (Flask)

    • Jak nastavit caching a zpracování statusu 304: Ujistěte se, že server správně kontroluje podmínky pro cachování.
    • Příklad kódu pro kontrolu podmínek caching:
                  from flask import Flask, request, make_response
                  from datetime import datetime
      
                  app = Flask(__name__)
      
                  @app.route('/resource')
                  def resource():
                      last_modified = datetime(2023, 10, 21, 7, 28, 0)
                      response = make_response("Data")
                      response.headers['Last-Modified'] = last_modified
                      if request.headers.get('If-Modified-Since') == last_modified.strftime("%a, %d %b %Y %H:%M:%S GMT"):
                          return '', 304
                      return response
                  

    Node.js (Express)

    • Jak zpracovávat požadavky s použitím statusu 304: Použijte middleware pro správu caching hlaviček.
    • Příklad kódu pro práci se záhlavími If-Modified-Since:
                  const express = require('express');
                  const app = express();
      
                  app.get('/resource', (req, res) => {
                      const lastModified = new Date('2023-10-21T07:28:00Z');
                      res.set('Last-Modified', lastModified.toUTCString());
                      if (req.headers['if-modified-since'] === lastModified.toUTCString()) {
                          return res.status(304).end();
                      }
                      res.send('Data');
                  });
                  

    4. Často se vyskytující chyby a způsoby jejich odstranění

    Chyba Popis Řešení
    Nesprávné nastavení cachingu na serveru Server nemusí správně vracet status 304. Zkontrolujte konfiguraci serveru a záhlaví pro caching.
    Chyby v záhlaví požadavku Klient nemusí správně posílat záhlaví If-Modified-Since. Ověřte, že klient správně nastavuje hlavičky.
    Jak zkontrolovat a odladit status 304 Obtíže při sledování, kdy je status 304 vrácen. Použijte nástroje pro ladění a sledování HTTP požadavků.