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?
http
caching
etag
expires-header
GeoffreyF67
źródło
źródło
Odpowiedzi:
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.
źródło
Nagłówki Etag i Last-zmodyfikowane są walidatorami .
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ą.
źródło
Expires
iCache-Control
są „silnymi nagłówkami buforującymi”Last-Modified
iETag
są „słabymi nagłówkami pamięci podręcznej”Najpierw sprawdź przeglądarkę,
Expires/Cache-Control
aby ustalić, czy wysłać żądanie do serweraJeśli musisz złożyć wniosek, wyśle
Last-Modified/ETag
żądanie HTTP. JeśliEtag
wartość 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.źródło
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ć.
źródło
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!
źródło
Jedną dodatkową rzeczą, o której chciałbym wspomnieć, że niektóre odpowiedzi mogły przeoczyć, jest wada posiadania obu tych elementów
ETags
i ichExpires/Cache-control
nagłó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/
źródło
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.
źródło
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 ;)
źródło