ETag vs Nagłówek wygasa

359

Rozejrzałem się dookoła, ale nie byłem w stanie dowiedzieć się, czy powinienem użyć zarówno ETag, jak i Expires Header czy jednego lub drugiego.

To, co próbuję zrobić, to upewnić się, że moje pliki Flash (i inne obrazy i co nie tylko zostaną zaktualizowane, gdy nastąpi zmiana w tych plikach).

Nie chcę robić nic specjalnego, na przykład zmieniać nazwy pliku lub umieszczać dziwne znaki na końcu adresu URL, aby nie było buforowane.

Ponadto, czy jest coś, co muszę zrobić programowo po mojej stronie w skryptach PHP, aby to obsługiwać, czy to wszystko Apache?

GeoffreyF67
źródło
1
developer.mozilla.org/en-US/docs/Web/HTTP/Caching (ogólnie dobre)
Christophe Roussy

Odpowiedzi:

677

Różnią się one nieznacznie - znacznik ETag nie zawiera żadnych informacji, których klient mógłby użyć, aby ustalić, czy ponownie poprosić o ten plik w przyszłości. Jeśli ETag jest wszystkim, co ma, zawsze będzie musiał złożyć wniosek. Jednak gdy serwer odczytuje ETag z żądania klienta, serwer może następnie ustalić, czy wysłać plik (HTTP 200), czy też nakazać klientowi, aby po prostu użył swojej kopii lokalnej (HTTP 304). ETag jest w zasadzie tylko sumą kontrolną dla pliku, który zmienia się semantycznie, gdy zmienia się zawartość pliku.

Nagłówek Expires jest używany przez klienta (i serwery proxy / pamięci podręczne) w celu ustalenia, czy w ogóle musi on wysłać żądanie do serwera. Im bliżej daty wygaśnięcia, tym większe prawdopodobieństwo, że klient (lub serwer proxy) wyśle ​​żądanie HTTP dla tego pliku z serwera.

Tak naprawdę to, co chcesz zrobić, to UŻYWAĆ ZARÓWNO nagłówków - ustaw nagłówek Expires na rozsądną wartość na podstawie częstotliwości zmian zawartości. Następnie skonfiguruj ETag, aby były wysyłane, aby kiedy klienci WYślą żądanie do serwera, łatwiej będzie ustalić, czy odesłać plik z powrotem.

Ostatnia uwaga na temat ETag - jeśli używasz konfiguracji serwera z równoważeniem obciążenia na wielu komputerach z uruchomionym Apache, prawdopodobnie będziesz chciał wyłączyć generowanie ETag. Wynika to z faktu, że i-węzły są używane jako część algorytmu skrótu ETag, który będzie różny dla poszczególnych serwerów. Możesz skonfigurować Apache, aby nie używał i-węzłów jako części obliczeń, ale wtedy chcesz się upewnić, że znaczniki czasu w plikach są dokładnie takie same, aby zapewnić wygenerowanie tego samego znacznika ETag dla wszystkich serwerów.

Marc Nowakowski
źródło
12
Powinieneś również sprawdzić, czy powinieneś używać Kontroli pamięci podręcznej zamiast Wygasa. Rozumiem, że Kontrola pamięci podręcznej została wprowadzona po wygaśnięciu i daje większą kontrolę. Zobacz stackoverflow.com/questions/5799906/…
Luis Perez
6
Korzystając z nagłówka Expires, dobrą praktyką jest zmiana nazwy pliku za każdym razem, gdy zmienia się zasób, ponieważ klient nie poprosi o plik ponownie, zanim będzie nieaktualny. Zwłaszcza jeśli korzystasz z dalekiej przyszłości wartości, gdy wygasa data.
schnatterer
8
Powiedzmy, że użyjemy obu. Co się stanie, gdy upłynie termin ważności, ale plik nie zostanie zmieniony (Etag jest taki sam)? Serwer zwróci 304, a plik będzie obsługiwany z pamięci podręcznej przeglądarki. Moje pytanie brzmi: czy w tej chwili zostanie zregenerowany czas wygasania?
user345602
2
Uważaj, ustawiając ETAG i nagłówek Expires na niezerową wartość. Może to prowadzić do warunków wyścigowych. Zobacz jakearchibald.com/2016/caching-best-practices
Weston
2
Czy można powiedzieć serwerom, aby w ogóle nie używały i-węzłów ani znaczników czasu? Ponadto, dlaczego są one potrzebne do znaczników ET, jeśli są używane tylko do reprezentowania treści?
Seza
108

Nagłówki Etag i Last-zmodyfikowanewalidatorami .

Pomagają przeglądarce i / lub pamięci podręcznej (odwrotnemu proxy) zrozumieć, czy plik / strona uległa zmianie, nawet jeśli zachowuje tę samą nazwę.

Wygasa i Cache-Control dają odświeżania informacji .

Oznacza to, że informują, przeglądarkę i odwrotnie pośredniczące serwery proxy, do której godziny lub jak długo mogą przechowywać stronę / plik w pamięci podręcznej.

Tak więc zazwyczaj pytaniem jest, którego walidatora użyć, etag lub ostatniej modyfikacji, i który nagłówek informacji o odświeżeniu do użycia, wygasa lub kontroluje pamięć podręczną.

Jan
źródło
31

Expiresi Cache-Controlsą „silnymi nagłówkami buforującymi”

Last-Modifiedi ETagsą „słabymi nagłówkami pamięci podręcznej”

Najpierw sprawdź przeglądarkę, Expires/Cache-Controlaby ustalić, czy wysłać żądanie do serwera

Jeśli musisz złożyć wniosek, wyśle Last-Modified/ETagżądanie HTTP. Jeśli Etagwartość dokumentu jest zgodna z tym, serwer wyśle ​​kod 304 zamiast 200 i nie będzie zawartości. Przeglądarka załaduje zawartość z pamięci podręcznej.

hienbt88
źródło
1
czy uważasz, że jakiś dokument obsługuje zachowanie „silnego i słabego buforowania”? Nie mogłem go znaleźć, a moja przeglądarka kliencka ma teraz priorytet nad ostatnią modyfikacją, a właściwie wygasa, co nie rozumiem dlaczego.
GMsoF,
1
@GMsoF Możesz rzucić okiem na: tools.ietf.org/html/rfc7232#section-2.1
Medeiros
Tak więc, jeśli chcę się upewnić, że moje zmiany są natychmiast propagowane do klienta, ale nadal korzystam z buforowania, mogę używać tylko Last-Modified i ETag, prawda?
Sebastien Lorber
To dla mnie najbardziej zwięzła, a jednak najjaśniejsza odpowiedź! Dzięki.
aderchox
18

Domyślnie Apache generuje Etag na podstawie numeru i-węzła pliku, daty ostatniej modyfikacji i rozmiaru, co powinno być w porządku, aby zrobić to, co chcesz. Myślę, że domyślnie wygeneruje również nagłówek Ostatnia modyfikacja na podstawie czasu ostatniej modyfikacji pliku na dysku, co również jest w porządku, aby zrobić to, co chcesz.

Prawdopodobnie powinieneś również wysłać Apache nagłówek Expires z datą na rok (zgodnie z http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ), aby przeglądarki wiedziały, że treść jest buforowalny. Spójrz na mod_expires, aby to skonfigurować.

David Z
źródło
Więc ETag będzie miał ostatnią modyfikację, a nagłówek wygasnie powie mu, że chcę go buforować, a kiedy przesyłam i nadpisuję mój plik, po prostu zostanie ponownie ściągnięty do pamięci podręcznej użytkownika, inaczej 304 zostanie wygenerowany, prawda?
GeoffreyF67
Etag zależy w skomplikowany sposób od daty ostatniej modyfikacji; ale po zmodyfikowaniu pliku Etag się zmieni. Wówczas Etag wysłany przez przeglądarkę (dla jego buforowanej wersji pliku) nie będzie pasował do Etag pliku na serwerze, a Apache wyśle ​​plik zamiast odpowiedzi 304.
David Z
6
Czy nagłówek, który wygasa za rok, nie powie klientowi, aby nawet przez rok nie sprawdzał nowej wersji?
John Bachir,
@John: tak, myślę, że myślałem o treści statycznej, która nigdy się nie zmienia, kiedy to piszę.
David Z
2
@John Bachir: należy się spodziewać, ale przeglądarka wydaje się uderzać w serwer przynajmniej po to, by zapytać o nowszą wersję. Otworzyłem kolejne pytanie na ten temat: stackoverflow.com/questions/10048740/…
Marco Demaio,
13

Kolejne podsumowanie:

Musisz użyć obu. Znaczniki ET są informacjami „po stronie serwera”. Wygasa to buforowanie po stronie klienta.

  • Używaj znaczników ETag, chyba że masz serwer z równoważeniem obciążenia. Są bezpieczne i poinformują klientów, że powinni otrzymywać nowe wersje plików serwera za każdym razem, gdy zmienisz coś po swojej stronie.

  • Wygasania należy używać ostrożnie, ponieważ jeśli ustawisz datę ważności daleko w przyszłości, ale chcesz natychmiast zmienić jeden z plików (na przykład plik JS), niektórzy użytkownicy mogą uzyskać zmodyfikowaną wersję dopiero po długim czasie!

Benjamin Piette
źródło
2
W przypadku takiej sytuacji wygasa, musisz po prostu zmienić nazwę swojego pliku js i zmienić go w kodzie HTML, i mam nadzieję, że nie ustawiłeś również wygasania pliku HTML również 1 rok.
EralpB,
1

Jedną dodatkową rzeczą, o której chciałbym wspomnieć, że niektóre odpowiedzi mogły przeoczyć, jest wada posiadania obu tych elementów ETagsi ich Expires/Cache-controlnagłówków.

W zależności od potrzeb może po prostu dodać dodatkowe bajty w nagłówkach, co może zwiększyć pakiety, co oznacza większy narzut TCP. Ponownie powinieneś sprawdzić, czy narzuty związane z posiadaniem obu rzeczy w nagłówkach są konieczne, czy też po prostu zwiększą ciężar twoich żądań, co obniży wydajność.

Możesz przeczytać więcej na ten temat w tym świetnym poście na blogu Kyle'a Simpsona: http://calendar.perfplanet.com/2010/bloated-request-response-headers/

aneagoie
źródło
1

Moim zdaniem, z Expire Header, serwer może powiedzieć klientowi, kiedy moje dane będą nieaktualne, podczas gdy w Etag serwer sprawdziłby wartość etag dla każdego żądania klienta.

Słoneczny
źródło
0

ETag służy do określania, czy zasób powinien użyć kopii. i wygasa Nagłówek taki jak Kontrola pamięci podręcznej jest informowany klientowi, że przed dekadami pamięci podręcznej klient powinien pobrać zasób lokalny.

We współczesnych witrynach często oferuje się plik o nazwie skrótu, na przykład app.98a3cf23.js, dlatego dobrą praktyką jest używanie Expires Header. Poza tym obniża także koszt sieci.

Mam nadzieję, że to pomoże ;)

Jack Chen
źródło