jeśli-zmodyfikowano-ponieważ vs jeśli-brak-dopasowania

89

Jaka może być różnica między if-modified-since i if-none-match? Mam wrażenie, że jeśli-brak-dopasowania jest używane dla plików, a jeśli-zmodyfikowane-ponieważ jest używane dla stron?

Wieża
źródło

Odpowiedzi:

112

Jeśli chodzi o różnice między Last-Modified/If-Modified-Sincei ETag/If-None-Match:

Oba mogą być używane zamiennie. Jednak w zależności od typu zasobu i sposobu jego generowania na serwerze, jedno lub drugie pytanie („czy to zostało zmodyfikowane od…?” / „Czy nadal pasuje do tego ETag?”) Może być łatwiejsze do udzielenia odpowiedzi .

Przykłady:

  • Jeśli udostępniasz pliki, użycie ich mtimejako Last-Modifieddaty jest najprostszym rozwiązaniem.
  • Jeśli obsługujesz dynamiczną stronę internetową zbudowaną z wielu zapytań SQL, sprawdzenie, czy dane zwrócone przez którekolwiek z tych zapytań uległy zmianie, może być niepraktyczne (chyba że wszystkie mają jakąś kolumnę „ostatnio zmodyfikowana”). W takim przypadku użycie np. Skrótu md5 zawartości strony ETagbędzie dużo łatwiejsze.
    OTOH, oznacza to, że nadal musisz wygenerować całą stronę na serwerze, nawet dla warunkowego GET. Dowiedzenie się, co dokładnie musi znaleźć się w ETag (klucze podstawowe, numery wersji itp.), Może zaoszczędzić sporo czasu.

Zobacz te linki, aby uzyskać więcej informacji na ten temat:

trendy
źródło
Wysłałem przeglądarce ETag, ale nigdy nie żąda ona tej samej strony z opcją If-None-Match. Jaki może być problem?
Pacerier,
2
@pacerier: przeglądarki nie są wymagane do korzystania z Etag. Więc może to być stara przeglądarka i po prostu ją zignorować. Inną możliwością jest to, że dostęp do jednostki uzyskuje się za pomocą parametrów adresu URL, które zmieniają się w zależności od wywołania. Jeśli nazwa jednostki ulegnie zmianie, etag nie będzie używany do różnych żądań.
Rafael Baptista
@RafaelBaptista Aby bardziej szczegółowo omówić drugą część komentarza, powiedz, że mam następującą sytuację: mam serwer plików, a serwer obsługuje wersjonowanie przy użyciu znaczników ETag i ze względu na wsteczną kompatybilność, klienci używali parametru zapytania my_current_version = (version ). Jeśli wyślę żądanie HTTP z różnymi wartościami dla my_current_version, ale także z tagami ET, to jakie kryterium, zgodnie z najlepszą praktyką, będzie traktowane priorytetowo przy określaniu, czy udostępnić nową wersję, czy odesłać 304? Dzięki!
laughing_man
1
Sposób wykorzystania Etag przez serwer zależy od serwera. Prawdopodobnie możesz skonfigurować większość serwerów plików tak, aby ignorowały parametry za pomocą etag, jeśli chcesz, korzystając z reguł przepisywania. Masz mniejszą kontrolę nad klientem - przeglądarką. Większość z nich nie wyśle ​​nagłówka etag, który otrzymali dla jednego zestawu parametrów w żądaniu innego. Żądanie klienta dotyczące obrazu? V = 1 nie wyśle ​​tego samego etagu dla obrazu? V = 2. Gdybym pisał własne serwery, zaimplementowałbym etag jako skrót zawartości obrazu. Każdy adres URL, który prosi o zasób i zawiera etag pasujący do skrótu obrazu, który bym wysłał, zwracam 304.
Rafael Baptista
22

If-Modified-Sincejest porównywany do, Last-Modifiedgdy If-None-Matchjest porównywany do ETag. Oba Modified-Sincei ETagmogą służyć do identyfikacji określonego wariantu zasobu.

Ale porównanie If-Modified-Sincedo Last-Modifieddaje informację, czy buforowane wariant jest starsza lub nowsza natomiast porównanie If-None-Matchdo ETagpo prostu daje informację, czy oba są identyczne lub nie. Ponadto większość ETaggeneratorów zawiera informacje o i- węźle specyficznym dla systemu, więc przeniesienie pliku na inny dysk może również zmienić ETag.

Gumbo
źródło
Ciekawe, ale dlaczego miałbym używać „identycznych” kontroli nad sprawdzeniami „ostatnio zmodyfikowanymi”? Jakie są korzyści? Jeśli masz plik do wyświetlenia, który z nich jest lepszą opcją?
Wieża
7
W przypadku komputerów czas jest kruchy. Sekundy przestępne, przełączanie między czasem letnim i niedokładnymi zegarami mogą spowodować, że kontrola „ostatniej modyfikacji” zwraca nieprawidłowy wynik. Porównanie samej treści (lub skrótu MD5 zawartości) pozwala uniknąć tych problemów.
devdanke
Pomimo tego, że w pełni rozumiem @devdanke, powiedziałbym, że sprawdzenie znacznika czasu jest znacznie szybsze niż sprawdzenie sumy md5. Celem tych nagłówków jest przyspieszenie, czasami lepiej nie przesyłać świeżej wersji jednostki do klienta, niż ładować serwer we / wy. W każdym razie użytkownik zawsze może nacisnąć ctrl + shift + R (lub ctrl + F5 lub cokolwiek)
Grief
13

Wartość znacznika czasu używana w funkcji Last-Modified / If-Modified-Since ma ograniczoną precyzję - jedna sekunda, a to po prostu nie wystarcza w przypadku szybko zmieniających się treści, takich jak na przykład aplikacja do czatu internetowego, w której więcej niż jedna wiadomość może zostać opublikowana w danej sekundzie . ETag / If-None-Match może pomóc w rozwiązaniu tego problemu.

Alex K.
źródło
9

Jak stwierdzono w najlepszych praktykach Google:

Ważne jest, aby określić jeden z Expires lub Cache-Control max-age i jeden z Last-Modified lub ETag dla wszystkich zasobów buforowanych. Nie ma potrzeby określania zarówno Expires, jak i Cache-Control: max-age, lub określania zarówno Last-Modified, jak i ETag.

https://developers.google.com/speed/docs/best-practices/caching

Dionysios Arvanitis
źródło
ten adres URL nie zawiera już podobnego tekstu. Nie wspomniano o żadnym ograniczeniu używania Last-Modifiedwith ETag(lub po stronie użytkownika If-Modified-Sincewith If-None-Match). Podobnie specyfikacja W3 nie ogranicza cię. Mówi, aby nie używać If-Modified-Sincez If-Match, ale zakładam, że to dlatego, że zestaw dokumentów, które mają zaktualizowane daty, ale taką samą zawartość, jak zdefiniowana przez ETag, powinien być dość mały.
mpag
3

O ile serwer nie określił jako słaby, ETag jest uważany za silny walidator i dlatego może być użyty do spełnienia warunkowego żądania zasięgowego. Jednak większość automatycznie generowanych ETagów wykazuje trudności w sytuacjach farmy serwerów, ponieważ często używają informacji i / lub unikalnego trwałego licznika. W praktyce stwierdziłem, że nagłówek Last Modified jest wystarczający dla dość statycznej zawartości, np. Obsługującej chronioną statyczną zawartość, ponieważ czas zapisu pliku jest dość dobrym walidatorem.

ETag jest zdecydowanie najbardziej elastyczny. Klienci spełniający wymagania są zobowiązani do wysłania ETag w żądaniu warunkowym, natomiast POWINNI wysłać oba, jeśli są dostępne.

Thomas S. Trias
źródło
0

Nagłówek If-Modified-Since służy do określenia czasu, w którym przeglądarka ostatnio otrzymała żądany zasób. Nagłówek If-None-Match służy do określenia znacznika jednostki, który serwer wystawił z żądanym zasobem, gdy został on ostatnio odebrany.

Na dwa opisane sposoby, te nagłówki są używane do obsługi buforowania zawartości w przeglądarce i umożliwiają serwerowi instruowanie przeglądarki, aby używała kopii zasobu w pamięci podręcznej, zamiast odpowiadać pełną zawartością zasobu, jeśli tak jest niekoniecznie.

Serhan M.
źródło