caching - Pysäytä selain tekemään HTTP-pyyntöjä kuville, joiden tulisi olla välimuistissa - mod_expires

Translate

Kun olet lukenut monia artikkeleita ja joitain kysymyksiä täältä,Olen vihdoin onnistunut aktivoimaan Apachemod_expireskertoa selaimelle sen PITÄÄ välimuistikuvat yhden vuoden ajan.

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

Ja onneksi palvelimen vastaukset näyttävät olevan oikeita:

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 

Luulin, että tämä pysäyttäisi selaimen lataamasta ja jopa tiedustelemaan palvelimelta kuvia 1 vuoden ajan. Mutta se on osittain totta: syyjos suljet ja avaat selaimen uudelleen, selain EI lataa kuviapalvelimelta enää,mutta selain kysyy palvelimelta edelleen HTTP-pyynnön jokaisesta kuvasta.

Kuinka pakotan selaimen lopettamaan HTTP-pyyntöjen tekemisen jokaiselle kuvalle? Vaikka kuvaa ei ladattaisikaan näiden HTTP-pyyntöjen jälkeen, ne ovat silti palvelimelle tehtyjä pyyntöjäse lisää tarpeettomasti viivästystä ja hidastaa sivun hahmontamista!

Sanoin jo selaimelle, että PITÄÄ pitää kuvat välimuistissa vuoden ajan! Miksi selain kysyy edelleen palvelimelta kutakin kuvaa (vaikka se ei lataa kuvaa) ?!


Tarkastellessani verkkokaavioita FireBugissa (valikko FireBug> Net> Kuvat) näen erilaisia välimuistikäyttäytymisiä (aloitin tietysti selaimen välimuistin ollessa täysin tyhjä, pakotin välimuistin poistamisen selaimessa "Poista kaikki historia" -toiminnolla):

  • Kun sivu ladataan ensimmäistä kertaa, kaikki kuvat ladataan(ja sama tapahtuu, jos pakotan sivun lataamaan uudelleen napsauttamalla selaimen lataa sivu -painiketta).Tässä on järkeä!

  • Kun navigoin sivustolla ja palaan samalle sivullekuvia ei ladata ollenkaan jaselain EI edes tiedustele palvelimeltamille tahansa kuvalle.Tämä on järkevää (ja haluaisin nähdä tämän käyttäytymisen myös silloin, kun selain on suljettu)!

  • Kun suljen selaimen ja avaan sen uudelleen samalla sivulla, typerä selain tekee HTTP-pyynnön palvelimelle joka kerta yhtä kuvaa kohti: se EI alioi kuvaa, mutta silti tekee HTTP-pyynnön, se on kuin selain kysyisi palvelimelle kuvan suhteen(palvelin vastaa 200 OK).Tämä ärsyttää minua!

Liitän myös alla olevat kaaviot, jos olet kiinnostunut:

enter image description here

enter image description here

EDIT: testattu juuri nyt myös FireFox 11.0: lla vain sen varmistamiseksi, ettei FireFox 3.6: ni ole liian vanha. Sama tapahtuu !!!Testasin myös Google-sivuston ja Stackoverflow-sivuston, he lähettävät molemmatCache-Control: max-age=...muttaselain tekee edelleen HTTP-pyynnön palvelimelle jokaisesta kuvasta, kun selain on suljettu ja avattu uudelleen samalla sivulla, palvelimen vastauksen jälkeen selain EI lataa kuvaa (kuten selitin edellä), mutta se tekee kuitenkin pirun pyynnön, joka lisää sivun näkemisen aikaa.

EDIT2: jaLast-Modifiedotsikko ehdotetun mukaisestitässä, ei ratkaise ongelmaa, eikä sillä ole mitään eroa.

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

Kaikki vastaukset

Translate

Käytit väärää työkalua pyyntöjen analysointiin.

Suosittelen todella hyödyllistä Firefox-lisäosaaLive-HTTP-otsikotjoten näet, mitä verkossa todella tapahtuu.

Ja vain olla varma, voit ssh / kitti palvelimesi ja tehdä jotain

tail -f /var/log/apache2/access.log
Lähde
Translate

Näkemäsi käyttäytyminen on tarkoitettu (ksRFC7234lisätietoja), määritelty käyttäytyminen:

Kaikki modernit selaimet lähettävät HTTP-pyynnöt palvelimelle jokaisesta näytetystä sivuelementistä välimuistin tilasta riippumatta. Tämä oli verkkopalveluiden (erityisesti mainosverkkojen) pyynnöstä tehty suunnittelupäätös sen varmistamiseksi, että HTTP-palvelimet pystyivät pitämään kirjaa jokaisen elementin jokaisesta näytöstä.

Jos selaimet eivät tehneet näitä pyyntöjä, palvelimelle ei koskaan ilmoiteta, että käyttäjälle on näytetty kuva. Mainosverkostojen kannalta tämä olisi katastrofaalista. Varhaisessa vaiheessa mainosverkostot hakkeroivat tiensä palvelemalla samaa mainoskuvaa satunnaisesti tuotetuilla nimillä (esim. 'Coke_ad_1_98719283719283.gif'). Internet-palveluntarjoajille tämä käytäntö aiheutti kuitenkin valtavaa lisääntymistä tiedonsiirrossa, koska jokainen heidän käyttäjistään ladasi nämä identtiset mainoskuvat uudelleen ohittamalla kaikki välimuistipalvelimet / välityspalvelimet, joita heidän Internet-palveluntarjoajansa toimi.

Joten aselepo saavutettiin: Selaimet lähettivät aina HTTP-pyyntöjä, myös vanhentuneille välimuistissa oleville elementeille. Palvelimet vastaavat HTTP 304 -tilakoodeilla ("ei muokattu"). Tämän avulla palvelimet voivat tallentaa kuvan siitä, että kuva näytettiin asiakkaalle. Tämän seurauksena mainosverkostotyleisestilopetti satunnaistettujen kuvien nimien käyttäminen verkon välimuistipalvelimien ohittamiseksi.

Tämä antoi mainosverkostoille mitä he halusivat - kirjaa jokaisesta näytetystä kuvasta - ja se antoi Internet-palveluntarjoajille mitä he halusivat - välimuistikelpoiset kuvat ja staattinen sisältö.

Siksi ei ole paljon tekemistä estääkseen selaimia lähettämästä HTTP-pyyntöjä välimuistissa oleville sivuelementeille.

Mutta jos tarkastellaan muita käytettävissä olevia asiakaspuolen ratkaisuja, jotka tulivat HTML5: n mukana, resurssien lataaminen voidaan estää

  1. Välimuistin ilmentymä(huolimatta hölynpölyistään)
  2. IndeksoituDB(mukavat asynkroniset ominaisuudet, sallii blob-tallennuksen)
  3. Paikallinen varasto(ei asynkronoitu)
Lähde
Translate

"Lataamisen" ja "virkistämisen" välillä on ero. Pelkkä selaaminen eteen- ja taaksepäin-painikkeilla olevalle sivulle ei yleensä käynnistä uusia HTTP-pyyntöjä, mutta nimenomaan F5: n napsauttaminen sivun "päivittämiseksi" saa selaimen tarkistamaan välimuistin. Tämä on selaimesta riippuvainen, mutta se näyttää olevan normi FF: lle ja Chromelle (ts. Selaimille, joilla on mahdollisuus tarkkailla verkkoliikennettään helposti.) Napsauttamalla F6-näppäintä, Enterin tulisi kohdistaa URL-osoiterivi ja sitten "mennä" siihen, minkä lataa sivu uudelleen, mutta älä tarkista sivun sisältöä uudelleen.

Päivittää: selityksen taaksepäin ja eteenpäin suunnistamiseen. Sitä kutsutaan "Back Forward Cache" taiBFCacheselaimissa. Kun navigoit taaksepäin / eteenpäin-painikkeilla, tarkoituksena on näyttää sinulle täsmälleen sellainen kuin sivu oli, kun näet sen omalla aikajanallasi. Palvelinpyyntöjä ei tehdä, kun käytetään edestakaisin, vaikka palvelimen välimuistin otsikossa sanotaan, että tietty kohde on vanhentunut.

Jos näet (200 OK BFCache) kehittäjäverkkopaneelissasi, palvelinta ei koskaan lyöty - edes kysyä jos modifioitu-koska.

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

Lähde
Translate

Jos pakotan päivityksen painamalla F5 tai F5 + Ctrl, pyyntö lähetetään. Jos kuitenkin suljen selaimen ja annan URL-osoitteen uudelleen, EI kyselyä lähetetään. Tapa, jolla testasin, lähetetäänkö pyyntö vai ei, käytti katkaisupisteitä palvelimen aloituspyynnössä, vaikka pyyntöä ei lähetettäisi, se näkyy edelleen Firebugissa 7 ms: n odotusarvona, joten varokaa tätä.

Lähde
Translate

Se, mitä kuvaat täällä, ei kuvasta kokemustani. Jos sisältöä tarjotaan ei-myymälää koskevalla direktiivillä tai teet nimenomaisen päivityksen, niin kyllä, odotan sen palaavan takaisin alkuperäiselle palvelimelle, muuten se tulisi tallentaa välimuistiin selaimen uudelleenkäynnistyksen yhteydessä (olettaen, että se on sallittua, ja voi kirjoittaa välimuistitiedosto).

Tarkastellessasi vesiputouksiasi hieman tarkemmin (mikä on hankalaa, koska ne ovat vähän pieniä ja epäselviä), selain näyttää tekevän juuri sitä mitä sen pitäisi - seonkuvien merkinnät - mutta nämä vain latautuvatpaikallisesta välimuististaei lähtöpalvelimelta - tarkista vastauksen Päiväys-otsikko (miksi luulet, että se vie millisekuntia sekuntien sijaan?) Siksi ne ovat väriltään eri tavalla.

Lähde
Translate

Kun vietin paljon aikaa kohtuullisen vastauksen etsimiseen, löysin alla olevan linkin hyödyllisimmäksi ja se vastaa täällä esitettyyn kysymykseen.

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

Lähde
Translate

Jos kyse on elämästä tai kuolemasta (Jos haluat optimoida sivun lataamisen tällä tavalla tai jos haluat vähentää palvelimen kuormitusta mahdollisimman paljon riippumatta siitä, mistä tahansa), on olemassa kiertotie.

Käytä HTML5: täpaikallinen varastotallentaa välimuistiin kuvat, kun niitä on pyydetty ensimmäistä kertaa.

  • [+]Voit estää selainta lähettämästä HTTP-pyyntöjä, jotka 99 prosentissa palauttaisivat 304 (Ei muokattu), riippumatta siitä kuinka kovasti käyttäjä yrittää (F5, ctrl + F5, yksinkertaisesti käymällä sivulla uudelleen jne.)

  • [-]Sinun on tehtävä joitain lisätoimia javascript-tuessa tähän.

  • [-]Kuvat tallennetaan base64: ään (emme voi tallentaa binaaritietoja), minkä vuoksi ne dekoodataan joka kerta asiakkaan puolella. Mikä onyleensämelko nopea eikä iso juttu, mutta se on silti jonkin verran ylimääräistä prosessorin käyttöä asiakkaan puolella ja se on pidettävä mielessä.

  • [-]Paikallinen tallennustila on rajoitettu. Voit pyrkiä käyttämään ~ 5mb dataa verkkotunnusta kohden (Huomaa: base64 lisää ~ 30% kuvan alkuperäiseen kokoon).

  • [?]Tukemasuurin osaselaimista.http://caniuse.com/#search=localstorage

Esimerkki

Testata

Lähde
Translate

Se, mitä näet Chromessa, ei ole kirjaa todellisista HTTP-pyynnöistä - se on kirjaa omaisuuspyynnöistä. Chrome tekee tämän osoittaakseen, että sivu todella pyytää omaisuutta. Tämä näkemys ei kuitenkaan oikeastaan osoita, onko pyyntö tehty. Jos omaisuus on välimuistissa, Chrome ei koskaan luo taustalla olevaa HTTP-pyyntöä.

Voit myös vahvistaa tämän viemällä hiiren aikajanan violettien segmenttien päälle. Välimuistissa olevilla resursseilla on(from cache)työkaluvihjeessä.

Jotta näet todelliset HTTP-pyynnöt, sinun on tarkasteltava alempaa tasoa. Joissakin selaimissa tämä voidaan tehdä laajennuksella (kuten Live HTTP -otsikot).

Todellisuudessa on kuitenkin tarkistettava palvelinlokisi tai käytettävä virheenkorjauspalvelinta kuten Charles tai Fiddler, jotta pyyntöjä ei tosiasiallisesti tehdä. Tämä toimii HTTP-tasolla varmistaakseen, että pyyntöjä ei tosiasiassa tapahdu.

Lähde
Translate

Välimuistin vahvistus ja 304-vastaus

Internet Explorerin on tarkistettava, onko välimuistissa oleva merkintä kelvollinen, useissa tilanteissa:

  • Välimuistissa olevalla merkinnällä ei ole vanhentumispäivää, ja sisältöä käytetään ensimmäistä kertaa selainistunnossa

  • Välimuistiin merkinnällä on viimeinen voimassaolopäivä, mutta se on vanhentunut

  • Käyttäjä on pyytänyt sivun päivitystä napsauttamalla Päivitä-painiketta tai painamalla F5

Jos välimuistissa olevalla merkinnällä on viimeinen muokkauspäivä, IE lähettää sen GET-pyyntöviestin otsikossa If-Modified-Since:

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

Palvelin tarkistaa If-Modified-Since -otsikon ja vastaa vastaavasti. Jos sisältöä ei ole muutettu määritetyn päivämäärän / kellonajan jälkeen, se vastaa tilakoodilla 304 ja vastausviestillä, joka sisältää vain otsikot:

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

Vastaus voidaan ladata nopeasti, koska se ei sisällä sisältöä ja saa IE lukemaan tarvitsemansa tiedot välimuistista. Itse asiassa se on kuin uudelleenohjaus paikalliseen selaimen välimuistiin.

Jos pyydetty objekti on tosiasiallisesti muuttunut If-Modified-Since-otsikossa olevan päivämäärän / kellonajan jälkeen, palvelin vastaa tilakoodilla 200 ja toimittaa resurssin muokatun version.

Lähde
Translate

Tähän kysymykseen on parempi vastaustässäverkkovastaavien pino-vaihto-sivustolla.

Lisätietoja, joka mainitaan myös yllä olevassa linkissä, on päällähttpwatch

Artikkelin mukaan:

Internet Explorerin on tarkistettava, onko välimuistissa oleva merkintä kelvollinen, useissa tilanteissa:

  • Välimuistissa olevalla merkinnällä ei ole vanhentumispäivää, ja sisältöä käytetään ensimmäistä kertaa selainistunnossa
  • Välimuistiin merkinnällä on viimeinen voimassaolopäivä, mutta se on vanhentunut
  • Käyttäjä on pyytänyt sivun päivitystä napsauttamalla Päivitä-painiketta tai painamalla F5

    Kirjoita koodi tähän

Lähde
Leave a Reply
You must be logged in to post a answer.
Kirjailijasta