26

Mam przedmiotów Amazon S3, a dla każdego obiektu, mam ustawioneDlaczego wciąż Przeglądarka wysyła żądanie publiczności Cache-Control z max-age?

Cache-Control: public, max-age=3600000 

czyli około 41 dni.

I mam Amazon CloudFront dystrybucji przedstawionym przy minimalnym TTL również 3600000.

jest to pierwszy wniosek po wyczyszczeniu pamięci podręcznej.

GET /1.0.8/web-atoms.js HTTP/1.1 
Host: d3bhjcyci8s9i2.cloudfront.net 
Connection: keep-alive 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 

i odpowiedź jest

HTTP/1.1 200 OK 
Content-Type: application/x-javascript 
Content-Length: 226802 
Connection: keep-alive 
Date: Wed, 28 Aug 2013 10:37:38 GMT 
Cache-Control: public, max-age=3600000 
Last-Modified: Wed, 28 Aug 2013 10:36:42 GMT 
ETag: "124752e0d85461a16e76fbdef2e84fb9" 
Accept-Ranges: bytes 
Server: AmazonS3 
Age: 342557 
Via: 1.0 6eb330235ca3971f6142a5f789cbc988.cloudfront.net (CloudFront) 
X-Cache: Hit from cloudfront 
X-Amz-Cf-Id: 92Q2uDA4KizhPk4TludKpwP6Q6uEaKRV0ls9P_TIr11c8GQpTuSfhw== 

Nawet podczas Amazon wyraźnie wysyła Cache-Control, Chrome nadal sprawia, że ​​drugie żądanie zamiast czytać je z pamięci podręcznej.

GET /1.0.8/web-atoms.js HTTP/1.1 
Host: d3bhjcyci8s9i2.cloudfront.net 
Connection: keep-alive 
Cache-Control: max-age=0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
If-None-Match: "124752e0d85461a16e76fbdef2e84fb9" 
If-Modified-Since: Wed, 28 Aug 2013 10:36:42 GMT 

Pytanie: Dlaczego chrom sprawia drugie żądanie?

Wygasa To zachowanie zmienia się, gdy umieszczam wyraźny atrybut Expires w nagłówkach. Przeglądarka nie wyśle ​​kolejnego żądania dotyczącego nagłówka Expires, ale dla publiczności sterującej pamięcią podręczną wyśle ​​ją. Moje wszystkie obiekty S3 nigdy się nie zmienią, są niezmienne, gdy zmieniamy plik, umieszczamy go jako nowy obiekt z nowym adresem URL.

Odsyłacz do skryptu strony Chrome czasami wysyła kolejne zapytania. Wykonałem ten test, wpisując adres URL w przeglądarce. Gdy skrypt jest określany przez strony HTML, przez kilka kolejnych żądań chrom ładunki buforowane skrypty, ale ponownie po jakimś czasie, raz na jakiś czas to będzie wysyłać żądania do serwera. Nie ma tutaj problemu z dyskiem, Chrome ma wystarczającą ilość pamięci podręcznej.

Problem polega na tym, że się opłata za każdy wniosek, i chcę obiekty S3 mają być buforowane na zawsze i powinny być ładowane z pamięci podręcznej i nigdy nie powinny łączyć się z serwerem z powrotem.

Odpowiedz

15

Jeśli odpowiedź HTTP zawiera wpis wytycznych, wniosek warunkowego zawsze będą wykonane. ETag to tag weryfikatora pamięci podręcznej. Klient zawsze wyśle ​​etag na serwer, aby sprawdzić, czy element został zmodyfikowany.

+1

Dzięki, ale to jest zły projekt, nie powinien on ignorować ETag, podczas gdy Max Age i public cache jest określony. S3 automatycznie dodaje ETag, czy muszę go usunąć lub czy mogę zmienić nagłówki, aby obsługiwać oczekiwane zachowanie? Nie wiem, czy istnieje sposób na usunięcie ETag w S3. –

+0

W Chrome stwierdziłem, że usunięcie wpisu jest jedynym sposobem, aby utrudnić warunkowe żądanie http. IE wykonuje o wiele lepszą pracę w tym IMHO. – woolagaroo

+0

Czy to błąd w Chrome, czy też jest poprawny zgodnie z protokołem HTTP 1.1? –

5

Jeśli Chrome Developer Tools są otwarte (F12), Chrome zwykle wyłącza buforowanie.

Jest sterowany w ustawieniach Narzędzia dla programistów - ikona biegów w prawo w dev-tools górnym pasku.

+0

Nie wiesz, jakie narzędzia do Chrome mają do czynienia z pytaniem użytkowników ... –

+4

F12 wyłącza tylko buforowanie, gdy zaznaczysz to pole, aby je wyłączyć, gdy testuję buforowanie, jestem pewien, że włączone jest buforowanie. –

+0

Świetna odpowiedź. Wprowadziłem odpowiednie zmiany na serwerze i przeglądałem wyniki przy pomocy Dev Tools (F12) i nie widziałem wpływu. Jest tyle małych rzeczy, które należy wiedzieć. +1 ode mnie. –

0

Jeśli naciskasz przycisk odświeżania w celu załadowania określonej strony lub zasobu, żądanie nagłówka if-modified-since jest wysyłane za każdym razem, jeśli zamiast tego zażądasz strony/zasobu jako oddzielnego żądania w nowej karcie lub za pomocą łącza w skrypcie lub stronę html, załaduje stronę/zasób z pamięci podręcznej przeglądarki.

Tak właśnie stało się w moim przypadku, może to być ogólny, ogólny przypadek. Nie jestem do końca pewien, ale to właśnie zebrałem przez moje kopanie.

27

Po naciśnięciu F5 w Chrome, będzie zawsze wysyłania żądania do serwera. Zostaną one wykonane z nagłówkiem Cache-Control:max-age=0.Serwer zwykle odpowiada za pomocą kodu statusu 304 (niezmienione).

Po naciśnięciu Ctrl + F5 lub Przesunięcie + F5 te same wnioski są wykonywane, ale z nagłówkiem Cache-Control:no-cache, zmuszając serwer wysłać bez używania pamięci podręcznej, zwykle z 200 (OK) kod statusu.

Jeśli chcesz się upewnić, że korzystasz z lokalnej pamięci podręcznej przeglądarki, po prostu naciśnij Wpisz w pasku adresu.

+0

Prosta i skuteczna odpowiedź. TIL 'F5' i' Enter' tworzą różne żądania. –

+0

wszyscy gratulują królowi: [Odśwież typy] (https://xkcd.com/1854/). –

+1

Trzy dni uderzają mnie w to. DZIĘKI! Wystawiłem Ctrl + F5 i nie wiedziałem, gdzie Control: no-cache pochodził i dlaczego przeglądarka ignorowała moją Cache-Control, lub gdy robiłem coś nie tak. Boże, dzięki! I @GrasDouble, thx za link. Wiem, że komentarzy nie powinno się dziękować, ale znalezienie odpowiedzi było wielką ulgą. –