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?
Odpowiedzi:
Jeśli chodzi o różnice między Last-Modified/If-Modified-Since
i 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:
mtime
jako Last-Modified
daty jest najprostszym rozwiązaniem.ETag
będzie dużo łatwiejsze. Zobacz te linki, aby uzyskać więcej informacji na ten temat:
If-Modified-Since
jest porównywany do, Last-Modified
gdy If-None-Match
jest porównywany do ETag
. Oba Modified-Since
i ETag
mogą służyć do identyfikacji określonego wariantu zasobu.
Ale porównanie If-Modified-Since
do Last-Modified
daje informację, czy buforowane wariant jest starsza lub nowsza natomiast porównanie If-None-Match
do ETag
po prostu daje informację, czy oba są identyczne lub nie. Ponadto większość ETag
generatorów zawiera informacje o i- węźle specyficznym dla systemu, więc przeniesienie pliku na inny dysk może również zmienić ETag
.
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.
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
Last-Modified
with ETag
(lub po stronie użytkownika If-Modified-Since
with If-None-Match
). Podobnie specyfikacja W3 nie ogranicza cię. Mówi, aby nie używać If-Modified-Since
z 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.
If-Modified-Since używa daty, a If-None-Match używa ETag . Mogą być używane zarówno dla „stron” (tj. HTML), jak i dla innych plików.
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.
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.