ETAG vs header Expires

Rozejrzałem się, ale nie byłem w stanie dowiedzieć się, czy powinienem używać zarówno ETag i nagłówka Expires lub jednego lub drugiego.

To, co staram się zrobić, to upewnić się, że moje pliki flash (i inne obrazy i to, co nie tylko się aktualizuje, gdy jest zmiana tych plików.

Nie chcę robić niczego specjalnego, jak zmiana nazwy pliku lub umieszczanie dziwnych znaków na końcu adresu url, aby nie był buforowany.

Czy jest coś, co trzeba zrobić programowo na mojej stronie w moich skryptach PHP, aby to obsługiwać, czy to wszystko Apache?

Author: Trott, 2009-02-01

7 answers

Są nieco inne - ETag nie posiada żadnych informacji, które klient może wykorzystać do ustalenia, czy w przyszłości ponownie zażądać tego pliku. Jeśli ETag jest wszystkim, co ma, zawsze będzie musiał złożyć wniosek. Jednakże, gdy serwer odczytuje ETag z żądania klienta, serwer może następnie określić, czy wysłać plik (HTTP 200) lub powiedzieć klientowi, aby po prostu użył swojej lokalnej kopii (HTTP 304). ETag jest w zasadzie tylko sumą kontrolną pliku, który semantycznie zmienia się, gdy zmienia się Zawartość pliku.

Nagłówek Expires jest używany przez Klienta (i Serwery Proxy/cache), aby określić, czy w ogóle musi wysłać żądanie do serwera. Im bliżej daty wygaśnięcia, tym bardziej prawdopodobne jest, że klient (lub serwer proxy) wyśle żądanie HTTP dla tego pliku z serwera.

Więc naprawdę to, co chcesz zrobić, to użyć obu nagłówków-Ustaw nagłówek Expires na rozsądną wartość w zależności od tego, jak często zawartość zmiany. Następnie skonfiguruj ETags do wysyłania tak, aby klienci wysyłali żądanie do serwera, mogli łatwiej określić, czy wysłać plik z powrotem.

Ostatnia uwaga na temat ETag-jeśli używasz konfiguracji serwera z obciążeniem z wieloma maszynami z Apache, prawdopodobnie będziesz chciał wyłączyć generowanie ETag. Dzieje się tak dlatego, że i-węzły są używane jako część algorytmu skrótu ETag, który będzie różny między serwerami. Możesz skonfigurować Apache tak, aby nie używał i-węzłów jako część obliczeń, ale następnie należy upewnić się, że znaczniki czasu na plikach są dokładnie takie same, aby upewnić się, że ten sam ETag zostanie wygenerowany dla wszystkich serwerów.

 649
Author: Marc Novakowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-11 08:46:57

nagłówki Etag i Ostatnio zmodyfikowane są walidatorami .

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

Expires i Cache-control dają odświeżanie informacji .

Oznacza to, że informują przeglądarkę i odwrotne serwery proxy, do jakiego czasu lub na jak długo mogą utrzymać stronę / plik na swoim cache.

Więc zazwyczaj pytanie brzmi, który z walidatorów użyć, etag lub ostatnio zmodyfikowany, a który odświeżyć nagłówek infomation użyć, expires lub cache-control.

 103
Author: john,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-09 14:29:24

Expires i Cache-Control są "silnymi nagłówkami buforowania"

Last-Modified i ETag są "słabymi nagłówkami buforowania"

Najpierw sprawdź przeglądarkę Expires/Cache-Control, Aby określić, czy wysłać żądanie do serwera

Jeśli trzeba złożyć żądanie, wyśle Last-Modified/ETag w żądaniu HTTP. Jeśli wartość Etag dokumentu jest taka sama, serwer wyśle kod 304 zamiast 200, bez zawartości. Przeglądarka załaduje zawartość ze swojej pamięci podręcznej.

 28
Author: hienbt88,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-04 15:45:10

Domyślnie Apache wygeneruje Etag na podstawie numeru i-węzła Pliku, daty ostatniej modyfikacji i rozmiaru, który powinien być idealny, aby robić to, co chcesz. Myślę, że będzie również generować domyślnie ostatnio zmodyfikowany nagłówek na podstawie czasu ostatniej modyfikacji pliku na dysku, który jest również w porządku, aby zrobić to, co chcesz.

Prawdopodobnie powinieneś też mieć Apache send an Expires header datowany na rok w przyszłości (zgodnie z http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ), aby przeglądarki wiedziały, że zawartość jest buforowalna. Spójrz na mod_expires aby to skonfigurować.

 19
Author: David Z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-01 01:25:30

Inne podsumowanie:

Musisz użyć obu. ETAG to informacje "po stronie serwera". Expires to buforowanie po stronie klienta.

  • Użyj ETags , 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.

  • Expires musi być używany z ostrożnością, tak jakby ustawiono datę wygaśnięcia daleko w przyszłości, ale chcesz zmienić jedną z pliki natychmiast (na przykład plik JS), niektórzy użytkownicy mogą nie dostać zmodyfikowanej wersji przez długi czas!

 13
Author: Benjamin Piette,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-17 17:43:16

Jedną dodatkową rzeczą, którą chciałbym wspomnieć, że niektóre odpowiedzi mogły zostać pominięte, jest minusowe posiadanie zarówno ETags, jak i Expires/Cache-control w nagłówkach.

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ęcej narzutu TCP. Ponownie powinieneś sprawdzić, czy narzut posiadania obu rzeczy w nagłówkach jest konieczny, czy po prostu zwiększy to wagę twoich żądań, co zmniejszy wydajność.

Możesz przeczytać więcej na ten temat on this excellent blog post by Kyle Simpson: http://calendar.perfplanet.com/2010/bloated-request-response-headers/

 1
Author: aneagoie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-14 19:21:09

Moim zdaniem, z nagłówkiem Expire, serwer może powiedzieć klientowi, kiedy moje dane będą stare, podczas gdy z Etag, serwer będzie sprawdzał wartość etag dla każdego żądania klienta.

 1
Author: Sunny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-22 08:36:52