caching - Спрете браузъра, за да прави HTTP заявки за изображения, които трябва да останат кеширани - mod_expires

Translate

След като прочетете много статии и някои въпроси тук,Най-накрая успях да активирам Apachemod_expiresда каже на браузъра, че ТРЯБВА да кешира изображения за 1 година.

<filesMatch "\.(ico|gif|jpg|png)$">
  ExpiresActive On
  ExpiresDefault "access plus 1 year"
  Header append Cache-Control "public"
</filesMatch>

И за щастие отговорите на сървъра изглеждат правилни:

HTTP/1.1 200 OK 
Date: Fri, 06 Apr 2012 19:25:30 GMT 
Server: Apache 
Last-Modified: Tue, 26 Jul 2011 18:50:14 GMT 
Accept-Ranges: bytes 
Content-Length: 24884 
Cache-Control: max-age=31536000, public 
Expires: Sat, 06 Apr 2013 19:25:30 GMT
Connection: close
Content-Type: image/jpeg 

Е, мислех, че това ще спре браузъра да се изтегли и дори ще попита сървъра за изображенията за 1 година. Но това е отчасти вярно: причинаако затворите и отворите отново браузъра, браузърът НЕ изтегля изображениятаот сървъра вече,но браузърът все още пита сървъра с HTTP заявка за всяко изображение.

Как да принудя браузъра да спре да прави HTTP заявки за всяко изображение? Дори ако тези HTTP заявки не са последвани от изтегляно изображение, те все още са заявки, отправени към сървъраче ненужно намалява латентността и забавя изобразяването на страницата!

Вече казах на браузъра, че ТРЯБВА да съхранява изображенията в кеш за 1 година! Защо браузърът все още пита сървъра за всяко изображение (дори ако не изтегля изображението) ?!


Разглеждайки мрежовите графики във FireBug (меню FireBug> Net> Изображения), виждам различно поведение на кеширането (очевидно започнах с напълно празен кеш на браузъра, принудих кеша да се изтрие в браузъра, използвайки „Изчистване на цялата история“):

  • Когато страницата се зареди за първи път, всички изображения се изтеглят(и същото се случва, ако принудя презареждане на страница, като кликнете върху бутона за презареждане на страницата на браузъра).Това има смисъл!

  • Когато навигирам в сайта и се върна на същата страницаизображенията изобщо не се изтеглят ибраузърът НЕ пита и сървъраза някое от изображенията.Това има смисъл (и бих искал да видя това поведение и когато браузърът е затворен)!

  • Когато затворя браузъра и го отворя отново на същата страница, глупавият браузър прави така или иначе HTTP заявка към сървъра еднократно за изображение: НЕ намалява изображението, но все пак прави HTTP заявка, все едно браузърът пита сървър за изображението(сървърът отговаря с 200 OK).Това е тази, която ме дразни!

Прилагам и графиките по-долу, ако се интересувате:

enter image description here

enter image description here

РЕДАКТИРАНЕ: току-що тествано сега и с FireFox 11.0, само за да се уверя, че не е проблем моят FireFox 3.6 е твърде стар. Същото се случва !!!Също така тествах сайта на Google и сайта на Stackoverflow, и двамата изпращатCache-Control: max-age=...нобраузърът все още прави HTTP заявка към сървъра за всяко изображение, след като браузърът се затвори и отвори отново на същата страница, след отговор на сървъра браузърът НЕ изтегля изображението (както обясних по-горе), но все пак отправя проклетата заявка, която увеличава времето за преглед на страницата.

EDIT2: и премахване наLast-Modifiedзаглавка, както е предложенотук, не решава проблема, не прави никаква разлика.

This question and all comments follow the "Attribution Required."

Всички отговори

Translate

Използвахте грешен инструмент за анализ на заявките.

Бих препоръчал наистина полезния Firefox addonHTTP заглавки на животака че можете да видите какво наистина се случва в мрежата.

И за да сте сигурни, можете да ssh / замажете вашия сървър и да направите нещо подобно

tail -f /var/log/apache2/access.log
източник
Translate

Поведението, което виждате, е предвиденото (вжRFC7234за повече подробности), посочено поведение:

Всички съвременни браузъри ще изпращат HTTP заявки до сървъра за всеки показан елемент на страница, независимо от състоянието на кеша. Това беше дизайнерско решение, взето по искане на уеб услуги (особено рекламни мрежи), за да се гарантира, че HTTP сървърите са в състояние да поддържат записи на всяко показване на всеки елемент.

Ако браузърите не отправят тези заявки, сървърът никога няма да бъде уведомен, че изображение е било показано на потребителя. За рекламните мрежи това би било катастрофално. В началото рекламните мрежи се „хакнаха“ по този начин, като показваха едно и също рекламно изображение, използвайки произволно генерирани имена (напр. „Coke_ad_1_98719283719283.gif“). Обаче за доставчиците на интернет услуги тази практика предизвика огромен ръст в трансферите на данни, тъй като всеки един от техните потребители преизтегляше тези идентични рекламни изображения, заобикаляйки всички кеширащи / прокси сървъри, които техният доставчик работеше.

Така че е постигнато примирие: Браузърите винаги ще изпращат HTTP заявки, дори за кеширани елементи с неизтекъл срок на годност. Сървърите ще отговорят с HTTP 304 кодове на състоянието („не е модифициран“). Това позволява на сървърите да записват факта, че изображението е показано на клиента. В резултат на това рекламни мрежив общи линииспря да използва произволни имена на изображения, за да заобиколи сървърите на мрежовия кеш.

Това даде на рекламните мрежи това, което искаха - запис на всяко показвано изображение - и даде на доставчиците на интернет това, което искаха - изображения с възможност за кеширане и статично съдържание.

Ето защо не можете да направите много, за да попречите на браузърите да изпращат HTTP заявки за кеширани елементи на страницата.

Но ако разгледате други налични клиентски решения, които се доставят заедно с html5, има обхват за предотвратяване на зареждането на ресурси

  1. Манифест на кеша(въпреки своите уловки)
  2. Индексирано DB(приятни асинхронни функции, позволява съхранение на BLOB)
  3. Локално хранилище(не асинхронно)
източник
Translate

Има разлика между „презареждане“ и „освежаване“. Самото навигиране до страница с бутони за назад и напред обикновено не инициира нови HTTP заявки, но по-специално натискането на F5 за „опресняване“ на страницата ще накара браузърът да провери отново кеша си. Това зависи от браузъра, но изглежда норма за FF и Chrome (т.е. браузърите, които имат способността лесно да наблюдават мрежовия си трафик.) Натискайки F6, въведете, трябва да фокусирате адресната лента на URL адреса и след това да "отидете" до него, което трябва презаредете страницата, но не проверявайте двойно активите на страницата.

Актуализиране: изясняване на навигационното поведение назад и напред. Нарича се „Кеш назад напред“ илиBFCacheв браузърите. Когато навигирате с бутони за назад / напред, намерението е да ви покаже точно такава, каквато е била страницата, когато сте я видели във вашата собствена времева линия. Не се правят заявки за сървър при използване назад и напред, дори ако заглавката на кеша на сървъра казва, че даден елемент е изтекъл.

Ако видите (200 OK BFCache) в мрежовия панел на разработчика, тогава сървърът никога не е бил ударен - дори да попита дали е модифициран оттогава.

http://www.softwareishard.com/blog/firebug/firebug-tip-what-the-heck-is-bfcache/

източник
Translate

Ако принудя опресняване с F5 или F5 + Ctrl, се изпраща заявка. Ако обаче затворя браузъра и въведа URL отново, тогава НЕ се изпраща заявка. Начинът, по който тествах дали дадена заявка е изпратена или не, беше чрез използване на точки на прекъсване при започване на заявка на сървъра, дори когато заявката не е изпратена, тя все още се показва във Firebug като е направила 7 ms изчакване, така че внимавайте за това.

източник
Translate

Това, което описвате тук, не отразява моя опит. Ако съдържанието се обслужва с директива no-store или правите изрично опресняване, тогава да, очаквам да се върне към първоначалния сървър, в противен случай трябва да се кешира при рестартиране на браузъра (ако приемем, че е разрешено и може да пише кеш файл).

Разглеждайки вашите водопади малко по-подробно (което е сложно, защото те са малко малки и размазани) браузърът изглежда прави точно това, което трябва - тойимазаписи за изображенията - но те просто се зареждатот локалния кешне от първоначалния сървър - проверете заглавката „Дата“ в отговора (защо мислите, че отнема милисекунди вместо секунди?). Ето защо те са оцветени по различен начин.

източник
Translate

След като прекарах значително време в търсене на разумен отговор, намерих връзката по-долу за най-полезна и отговаря на въпроса, зададен тук.

https://webmasters.stackexchange.com/questions/25342/headers-to-prevent-304-if-modified-since-head-requests

източник
Translate

Ако става въпрос за живот или смърт (Ако искате да оптимизирате зареждането на страницата по този начин или ако искате да намалите натоварването на сървъра колкото е възможно повече, независимо какво), тогава има заобиколно решение.

Използвайте HTML5локално съхранениеза кеширане на изображения, след като са били поискани за първи път.

  • [+]Можете да попречите на браузъра да изпраща HTTP заявки, които в 99% биха върнали 304 (непроменени), без значение колко усилено се опитва потребителят (F5, ctrl + F5, просто преразглеждане на страница и т.н.)

  • [-]За това трябва да положите допълнителни усилия в поддръжката на javascript.

  • [-]Изображенията се съхраняват в base64 (не можем да съхраняваме двоични данни), затова те се декодират всеки път от страна на клиента. Кое еобикновенодоста бързо и не е голяма работа, но все пак е допълнително използване на процесора от страна на клиента и трябва да се има предвид.

  • [-]Локалното съхранение е ограничено. Можете да се стремите към използване на ~ 5mb данни на домейн (Забележка: base64 добавя ~ 30% към оригиналния размер на изображението).

  • [?]С подкрепата намнозинствона браузърите.http://caniuse.com/#search=localstorage

Пример

Тест

източник
Translate

Това, което виждате в Chrome, не е запис на действителните HTTP заявки - това е запис на заявки за активи. Chrome прави това, за да ви покаже, че страницата действително иска даден актив. Този изглед обаче всъщност не показва дали е направена заявката. Ако активът е кеширан, Chrome всъщност никога няма да създаде основната HTTP заявка.

Можете също да потвърдите това, като задържите курсора на мишката върху лилавите сегменти в хронологията. Кешираните ресурси ще имат(from cache)в подсказката.

За да видите действителните HTTP заявки, трябва да погледнете на по-ниско ниво. В някои браузъри това може да се направи с приставка (като Live HTTP Headers).

В действителност обаче, за да проверите дали заявките всъщност не се правят, трябва да проверите регистрационните файлове на вашия сървър или да използвате прокси за отстраняване на грешки като Charles или Fiddler. Това ще работи на ниво HTTP, за да се увери, че заявките всъщност не се случват.

източник
Translate

Проверка на кеша и отговор 304

Има редица ситуации, в които Internet Explorer трябва да провери дали кешираният запис е валиден:

  • Кешираният запис няма дата на изтичане и съдържанието се осъществява за първи път в сесия на браузъра

  • Кешираният запис има срок на годност, но е изтекъл

  • Потребителят е поискал актуализация на страницата, като щракне върху бутона Обновяване или натисне F5

Ако кешираният запис има дата на последна модификация, IE го изпраща в заглавката If-Modified-Since на съобщение за заявка GET:

GET /images/logo.gif HTTP/1.1
Accept: */*
Referer: http://www.google.com/
Accept-Encoding: gzip, deflate
If-Modified-Since: Thu, 23 Sep 2004 17:42:04 GMT
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)
Host: www.google.com

Сървърът проверява заглавката If-Modified-Since и отговаря съответно. Ако съдържанието не е променено от посочената дата / час, той отговаря с код на състоянието 304 и съобщение за отговор, което съдържа само заглавки:

HTTP/1.1 304 Not Modified
Content-Type: text/html
Server: GWS/2.1
Content-Length: 0
Date: Thu, 04 Oct 2004 12:00:00 GMT

Отговорът може да бъде изтеглен бързо, защото не съдържа съдържание и кара IE да чете данните, които се изискват от кеша. Всъщност това е като пренасочване към кеша на локалния браузър.

Ако заявеният обект действително се е променил от датата / часа в заглавката If-Modified-Since, сървърът отговаря с код на състоянието 200 и предоставя модифицираната версия на ресурса.

източник
Translate

Този въпрос има по-добър отговортукна уеб сайта за обмен на стекове.

Повече информация, която също е цитирана в горната връзка, е включенаhttpwatch

Според статията:

Има редица ситуации, в които Internet Explorer трябва да провери дали кешираният запис е валиден:

  • Кешираният запис няма дата на изтичане и съдържанието се осъществява за първи път в сесия на браузъра
  • Кешираният запис има срок на годност, но е изтекъл
  • Потребителят е поискал актуализация на страницата, като щракне върху бутона Обновяване или натисне F5

    Въведете кода тук

източник
Leave a Reply
You must be logged in to post a answer.
За автора