Zawartość

    Odpowiedź serwera 304 Not Modified

    HTTP Status Code 304 (Not Modified)

    HTTP status code 304 (Not Modified) jest odpowiedzią serwera, która wskazuje, że żądany zasób nie został zmieniony od momentu ostatniego żądania klienta. Kodeks ten jest wykorzystywany do optymalizacji pracy z pamięcią podręczną, co pozwala uniknąć przesyłania danych, które nie uległy zmianie.

    304 - Not Modified

    1. Główne cechy statusu 304

    • Definicja i przeznaczenie: Status 304 pozwala klientowi (np. przeglądarce) na określenie, czy powinien pobrać zasób ponownie, czy może skorzystać z kopii w pamięci podręcznej.
    • Jak działa mechanizm kształtowania pamięci podręcznej z użyciem 304: Gdy klient wysyła zapytanie o zasób, dołącza do niego nagłówki, które informują serwer, kiedy zasób został ostatnio pobrany. Serwer porównuje daty i decyduje, czy zwrócić nową wersję, czy status 304.
    • Warunki, w których serwer zwraca status 304: Status 304 jest zwracany, gdy zasób nie zmienił się od ostatniego pobrania, co jest weryfikowane na podstawie nagłówków takich jak If-Modified-Since i If-None-Match.

    2. Praktyczne przykłady użycia statusu 304

    Przykład z pamięcią podręczną obrazów na stronie internetowej

    • Jak przeglądarka przechowuje pamięć podręczną: Przeglądarki internetowe przechowują zasoby, takie jak obrazy, aby zminimalizować czas ładowania stron. Gdy zasób jest pobierany po raz pierwszy, jest zapisywany w pamięci podręcznej.
    • Zachowanie przy ponownym żądaniu: Przy ponownym żądaniu przeglądarka sprawdza lokalną pamięć podręczną. Jeśli zasób nie uległ zmianie, wysyła zapytanie z nagłówkiem If-Modified-Since, a serwer odpowiada statusem 304.

    Przykład z API

    Status 304 może być również użyty w kontekście API, gdzie zasoby są często aktualizowane. Klient może zapytać serwer o konkretny zasób, a jeśli nie uległ on zmianie, serwer odpowiada statusem 304, co pozwala zaoszczędzić na transferze danych.

    Przykład z nagłówkami If-Modified-Since i If-None-Match

    Klient może dołączyć nagłówki If-Modified-Since lub If-None-Match do swojego żądania. W przypadku, gdy zasób nie zmienił się od podanego czasu lub nie zmienił swojego etag, serwer zwraca status 304.

    Nagłówek Opis
    If-Modified-Since Określa datę, od której klient chce sprawdzić, czy zasób uległ zmianie.
    If-None-Match Używa etag do porównania, czy zasób na serwerze zmienił się od ostatniego pobrania.

    3. Jak naprawić problemy z kodem 304 w różnych językach programowania

    PHP

    • Jak poprawnie ustawić nagłówki dla pamięci podręcznej: W PHP można ustawić odpowiednie nagłówki, aby informować przeglądarki o tym, jak długo powinny przechowywać zasoby.
    • Przykład kodu do obsługi żądań i zwracania statusu 304:
              if (filemtime('file.txt') <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
                  header('HTTP/1.1 304 Not Modified');
                  exit;
              }
              

    Python (Flask)

    • Jak skonfigurować pamięć podręczną i przetwarzanie statusu 304: W Pythonie używamy Flask, aby zarządzać nagłówkami.
    • Przykład kodu do sprawdzania warunków pamięci podręcznej:
              from flask import Flask, request, make_response
              app = Flask(__name__)
      
              @app.route('/resource')
              def resource():
                  response = make_response('Content')
                  response.headers['Last-Modified'] = 'Wed, 21 Oct 2015 07:28:00 GMT'
                  if request.headers.get('If-Modified-Since') == response.headers['Last-Modified']:
                      return '', 304
                  return response
              

    Node.js (Express)

    • Jak obsługiwać żądania z użyciem statusu 304: Express pozwala na łatwe zarządzanie nagłówkami w odpowiedziach.
    • Przykład kodu do pracy z nagłówkami If-Modified-Since:
              app.get('/resource', (req, res) => {
                  const lastModified = 'Wed, 21 Oct 2015 07:28:00 GMT';
                  res.set('Last-Modified', lastModified);
                  if (req.headers['if-modified-since'] === lastModified) {
                      return res.status(304).end();
                  }
                  res.send('Content');
              });
              

    4. Często występujące błędy i sposoby ich rozwiązania

    • Niewłaściwa konfiguracja pamięci podręcznej na serwerze: Upewnij się, że odpowiednie nagłówki są ustawione, aby umożliwić prawidłowe działanie pamięci podręcznej.
    • Błędy w nagłówkach żądania: Sprawdź, czy nagłówki If-Modified-Since i If-None-Match są poprawnie sformułowane.
    • Jak sprawdzić i debugować status 304: Użyj narzędzi deweloperskich w przeglądarkach, aby monitorować nagłówki i odpowiedzi serwera.