2009-02-18 10 views
13

W module Apache mod_expires istnieje dyrektywa Expires z dwóch okresów bazowych czasowych dostępu i modyfikacji.Cache Wygasnąć Kontrola z ostatniej modyfikacji

ExpiresByType text/html "access plus 30 days" 

oznacza, że ​​pamięć podręczna będzie wymagać świeżej zawartości po 30 dniach.

Jednak

ExpiresByType text/html "modification plus 2 hours" 

nie ma intuicyjny sens.

Jak działa pamięć podręczna przeglądarki wiedzieć, że plik był modyfikowany, chyba że wysyła żądanie do serwera? A jeśli dzwoni do serwera, jaki jest pożytek z buforowania tej dyrektywy? Wydaje mi się, że nie rozumiem niektórych kluczowych elementów pamięci podręcznej. Proszę, oświeć mnie.

Odpowiedz

35

dyrektywę Expires* z „modyfikacja” jako podstawy odnosi się do czasu modyfikacji pliku na serwerze. Jeśli więc ustawisz, powiedzmy "modyfikacja plus 2 godziny", każda przeglądarka, która zażąda treści w ciągu 2 godzin po modyfikacji pliku (na serwerze), buforuje tę zawartość do 2 godzin po czasie modyfikacji pliku. Przeglądarka wie, kiedy ten czas jest, ponieważ serwer wysyła nagłówek Expires z właściwym czasem wygaśnięcia.

Pozwól mi wyjaśnić na przykładzie: powiedzieć konfiguracja Apache zawiera linię

ExpiresDefault modification plus 2 hours 

i masz plik index.html, których dyrektywa ma zastosowanie do ExpiresDefault na serwerze. Załóżmy, że przesyłasz wersję index.html o 9:53 GMT, zastępując poprzednią istniejącą index.html (jeśli taka była). Teraz czas modyfikacji index.html wynosi 9:53 GMT. Jeżeli biegli ls -l na serwerze (lub dir w systemie Windows), można zobaczyć go w wykazie:

-rw-r--r-- 1 apache apache 4096 Feb 18 09:53 index.html 

Teraz z każdego żądania, Apache wysyła nagłówek Last-Modified o czas ostatniej modyfikacji pliku. Ponieważ masz tę dyrektywę ExpiresDefault, wyśle ​​ona również nagłówek Expires z czasem równym czasowi modyfikacji pliku (9:53) plus dwie godziny. Więc tutaj jest częścią tego, co przeglądarka widzi:

Last-Modified: Wed, 18 Feb 2009 09:53:00 GMT 
Expires: Wed, 18 Feb 2009 11:53:00 GMT 

Jeśli czas, w którym przeglądarka sprawia, że ​​ten wniosek jest przed 11:53 GMT, przeglądarka będzie buforować stronę, ponieważ jeszcze nie upłynął.Jeśli więc użytkownik najpierw odwiedza stronę o 11:00 GMT, a następnie ponownie przejdzie na tę samą stronę o godzinie 11:30 GMT, przeglądarka zobaczy, że jego wersja z pamięci podręcznej jest nadal ważna i nie będzie (lub raczej nie będzie mogła) Utwórz nowe żądanie HTTP.

Jeśli użytkownik wejdzie na stronę trzeci raz o 12:00 GMT, przeglądarka zobaczy, że jego wersja z pamięci podręcznej wygasła (jest po 11:53), więc próbuje zweryfikować stronę, wysyłając żądanie do serwer z nagłówkiem If-Modified-Since. Odpowiedź 304 (niezmodyfikowana) bez treści zostanie zwrócona, ponieważ data strony nie została zmieniona od czasu jej pierwszego wyświetlenia. Od upłynięcia daty ważności - strona jest "nieaktualna" - próba sprawdzenia poprawności będzie dokonywana przy kolejnych odwiedzinach strony do momentu niepowodzenia sprawdzania poprawności.

Teraz, zamiast tego, udawajmy, że przesłałeś nową wersję strony o 11:57. W tym przypadku próba potwierdzić starą wersję strony na 12:00 przeglądarki zawodzi i nie otrzyma odpowiedzi, wraz z nowej strony, te dwa nowe nagłówki:

Last-Modified: Wed, 18 Feb 2009 11:57:00 GMT 
Expires: Wed, 18 Feb 2009 13:57:00 GMT 

(Ostatni czas modyfikacji pliku staje się 11:57 po przesłaniu nowej wersji, a Apache oblicza czas wygaśnięcia jako 11:57 + 2:00 = 13:57 GMT.)

Walidacja (przy użyciu bardziej aktualnej daty) nie będzie wymagane do 13:57.

(Uwaga oczywiście, że wiele innych rzeczy są wysyłane wraz z dwoma nagłówkami I wymienione powyżej, po prostu przycięte na całą resztę dla uproszczenia)

+0

Witaj David, to ma sens, ale nadal nie jestem pewien, dlaczego i jak serwer wie, aby wysłać przeglądarkę. Więc jeśli dobrze zrozumiem, następnym razem, gdy przeglądarka zażąda zasobu, serwer w jakiś sposób przesyła informacje do przeglądarki o stanie modyfikacji plików - ale nie jest to dostanie –

+0

Pomyślałem, że najłatwiej byłoby to wyjaśnić na przykładzie, więc Edytowałem jeden w ... –

+0

niesamowite dzięki za twój czas –

0

moim rozumieniu jest to, że modyfikacja prosi przeglądarkę oparcia czas cache w oparciu o wartości Last Modificatied nagłówka HTTP jest. Zatem modyfikacja plus 2 godziny byłaby czasem ostatniej modyfikacji + 2 godziny.

3

Serwer wysyła nagłówek, takich jak: „Last-Modified: Wed, 18 Feb 2009 00:00:00 GMT”. Pamięć podręczna zachowuje się w oparciu o ten nagłówek lub czas dostępu.

powiedzieć, jeśli oczekuje się, że zawartość być odświeżane codziennie, a chcesz go wygaśnie „modyfikacja Plus 24 godzin”.

Jeśli nie wiadomo, kiedy zawartość zostanie odświeżony, to lepiej, aby oprzeć go na czas dostępu.

+0

Cześć Andrzeju, dzięki za odpowiedź. Kiedy i jak często serwer wysyła nagłówek Last Modified? Czy dzieje się to podczas sesji przeglądarki? –

0

Przede wszystkim, dzięki Davidowi oo za szczegółowe wyjaśnienie powyżej . W odpowiedzi na pytanie buszmena o to, dlaczego wywołanie buforowania ma sens, jeśli serwer nadal wymaga zgłoszenia, odpowiedź brzmi, że czas jest zapisywany w tym, co zwraca serwer. Jeśli dyrektywy dotyczące pamięci podręcznej wskazują, że zawartość pliku jest wciąż aktualna, zamiast zwracania zawartości zwracany jest kod 304 z pustą treścią odpowiedzi. Właśnie tam oszczędza się czas.

lepszego wyjaśnienia niż Dałem jest tutaj, z https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers:

Choć wnioski o warunkowe zrobić wywołania połączenia przez sieć, niemodyfikowanych zasobów spowodować pustym korpusie odpowiedzi - oszczędność kosztów przeniesienia resource powrót do klienta końcowego. Usługa backendu często jest także w stanie bardzo szybko określić datę ostatniej modyfikacji zasobu bez dostępu do zasobu, który sam oszczędza nietrywialny czas przetwarzania.

Time-based

Żądanie warunkowego na podstawie czasu zapewnia, że ​​tylko wtedy, gdy żądany zasób zmienił się od skopiuj przeglądarce została buforowane będą zawartość być przeniesione. Jeśli kopia z pamięci podręcznej jest najbardziej aktualna, serwer zwraca kod odpowiedzi 304.

Aby włączyć żądania warunkowe, aplikacja określa czas ostatniej modyfikacji zasobu za pośrednictwem nagłówka ostatniej modyfikacji.

Cache-Control: public, max-age = 31536000 Last-Modified: Pon, 03 stycznia 2011 17:45:57 GMT

Następnym razem, gdy przeglądarka żąda tego zasobu będzie prosić tylko o zawartości zasobu, jeśli są niezmienne od tej daty przy użyciu if-Modified-Since nagłówka żądania

if-Modified-Since: Mon, 03 stycznia 2011 17:45:57 GMT

Jeśli zasób hasn” t zmienił się od Pon, 03 stycznia 2011 17:45:57 GMT serwer powróci z pustym ciałem z kodem odpowiedzi 304.

Powiązane problemy