Jak dokładnie działa „304 Not Modified”?

174
  • W jaki sposób generowane są odpowiedzi „304 Not Modified”?

  • W jaki sposób przeglądarka ustala, czy odpowiedź na żądanie HTTP to 304?

  • Czy jest ustawiana przez przeglądarkę czy wysyłana z serwera?

  • W przypadku wysłania przez serwer, w jaki sposób serwer zna dane dostępne w pamięci podręcznej, a także w jaki sposób ustawia 304 obraz?

Domyślam się, jeśli jest generowany przez przeglądarkę:

function is_modified()
{
    return get_data_from_cache() === get_data_from_url();
}

function get_data_from_cache()
{
    return some_hash_or_xxx_function(cache_data);
}

function get_data_from_url()
{
     return some_hash_or_xxx_function(new_data);
}

function some_hash_or_xxx_function(data)
{
     // Do something with the data.
     // What is that algorithm?
     return result;
}

console.log(is_modified());

Opieram się na zewnętrznym dostawcy API, aby pobierać dane, analizować je i przekazywać do mojej bazy danych. Dane mogą, ale nie muszą, zmieniać się podczas każdego żądania, ale nagłówek zawsze wysyła 200. Nie chcę analizować, sprawdzać ostatni unikatowy identyfikator w DB i tak dalej ..., aby określić zmiany w danych, ani porównać wynik bezpośrednio, a ja md5(), sha1()i crc32()mieszany wynik i działa dobrze, ale zastanawiam się o algorytm do ustalenia 304.

Chcę użyć tego samego algorytmu, aby określić zmianę moich danych.

VenomVendor
źródło
2
Tak, wyszukałem w Google, jak działa 304 niezmodyfikowany , ale nie dostałem żadnej odpowiedzi.
VenomVendor
1
Musisz być trochę bardziej ogólny. google.com/search?q=http%20caching
SLaks

Odpowiedzi:

200

Kiedy przeglądarka umieszcza coś w swojej pamięci podręcznej, przechowuje również nagłówek Last-Modifiedlub ETagz serwera.

Następnie przeglądarka wysyła żądanie z nagłówkiem If-Modified-Sincelub If-None-Match, informując serwer, aby wysłał 304, jeśli zawartość nadal ma tę datę lub etykietę ETag.

Serwer potrzebuje jakiegoś sposobu obliczenia daty modyfikacji lub ETag dla każdej wersji każdego zasobu; zwykle pochodzi z systemu plików lub oddzielnej kolumny bazy danych.

SLaks
źródło
1
ETagto słowo kluczowe, sprawdzone z nagłówkami ETagpozostaje takie samo w obu Response Headers& Response Headers From Cache, czy możesz powiedzieć algorytmowi stojącemu za nim ETag. Zaktualizowałem moje pytanie, podając moje wymagania.
VenomVendor
4
@VenomVendor: ETagto tylko pole, w którym serwer może przechowywać unikalny identyfikator (zwykle skrót lub numer wersji lub zegar wektorowy). W ogóle nie pomaga w obliczaniu tego identyfikatora; to zależy od kodu po stronie serwera.
SLaks
@SLaks: Co się stanie, jeśli strona ma wywołanie db ... Jest szansa, że ​​dane w bazie danych uległyby zmianie .. W tym przypadku nie ma sensu sprawdzanie ostatnio zmodyfikowanego wywołania, Correct ?. Jak to się dzieje, że ten stan jest rozpatrywany?
user1050619
3
@ user1050619: To do twojego serwera należy upewnienie się, że ETag jest dokładny. Jeśli pokazujesz dane z bazy danych, musisz to uwzględnić.
SLaks
Jedną rzeczą, która jest nadal niejasna, jest to, czy jeśli masz duży, max-ageczy przeglądarka musi wysyłać żądanie? (ponieważ może odgiąć w 304 i w ogóle nie wysyłać żądania) ... chcesz tego np. z aktywami „pobranymi odciskiem palca” (są dobre na zawsze). W przeciwnym razie, jaki jest sens max-age...
Andy Hayden,
19

Ostatnia modyfikacja: data ostatniej modyfikacji żądanego obiektu

If-Modified-Since: umożliwia zwrócenie 304 Not Modified, jeśli data ostatniej modyfikacji nie uległa zmianie.

ETag: ETag to nieprzejrzysty identyfikator przypisany przez serwer WWW do określonej wersji zasobu znalezionego pod adresem URL. Jeśli reprezentacja zasobów pod tym adresem URL kiedykolwiek się zmieni, zostanie przypisany nowy i inny ETag.

If-None-Match: umożliwia zwrócenie 304 Not Modified, jeśli ETag pozostaje niezmieniony.

pamięć podręczna przeglądarki z datą (Last-Modified) lub id (ETag), gdy trzeba ponownie zażądać adresu URL, przeglądarka wysyła wiadomość z żądaniem z nagłówkiem:

wprowadź opis obrazu tutaj

serwer zwróci 304, gdy instrukcja if ma wartość False, a przeglądarka użyje pamięci podręcznej.

宏杰 李
źródło