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.
źródło
Odpowiedzi:
Kiedy przeglądarka umieszcza coś w swojej pamięci podręcznej, przechowuje również nagłówek
Last-Modified
lubETag
z serwera.Następnie przeglądarka wysyła żądanie z nagłówkiem
If-Modified-Since
lubIf-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.
źródło
ETag
to słowo kluczowe, sprawdzone z nagłówkamiETag
pozostaje takie samo w obuResponse Headers
&Response Headers From Cache
, czy możesz powiedzieć algorytmowi stojącemu za nimETag
. Zaktualizowałem moje pytanie, podając moje wymagania.ETag
to 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.max-age
czy 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 sensmax-age
...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:
serwer zwróci 304, gdy instrukcja if ma wartość False, a przeglądarka użyje pamięci podręcznej.
źródło