Cum pot preveni cache-ul unei pagini de către browsere?
Înainte de a ne uita la metodele de cache client și server, în primul rând trebuie să înțelegem cum să împiedicăm cache-ul paginilor de către un browser web (și servere proxy). Principalul mod de a realiza acest lucru este utilizarea meta-tagurilor HTML:
Introducerea datei trecute în meta-tag-ul Expiră, spuneți browser-ului că copia memorată în cache a paginii este întotdeauna depășită. Aceasta înseamnă că browserul nu ar trebui să cacheze pagina. Meta tag-ul Pragma: no-cache este o convenție destul de bine susținută, urmată de majoritatea browserelor web. După ce ați descoperit această etichetă, ei de obicei nu cachează pagina (deși nu există nici o garanție, este doar un acord).
Sună bine, dar există două probleme cu utilizarea meta-tagurilor:
- Dacă o etichetă nu există atunci când o pagină a fost solicitată de browser pentru prima dată, dar apare mai târziu (de exemplu, modificați fișierul pageheader.php inclus. Ceea ce este un capac de fiecare pagină web), browser-ul va rămâne blissfully cunoștință, și va folosi minele Sway stocate în memoria cache ale originalului.
- Proxy serverele care cache pagini web, cum ar fi un ISP generic, nu va examina direct conținutul documentului HTML. În schimb, se bazează numai pe serverul web de la care s-au introdus documentele și pe protocolul HTTP. Cu alte cuvinte, browser web poate presupune că nu ar trebui să fi memorată în cache, dar un server proxy între browser și serverul de web, probabil, nu-l știu - și va continua să trimită clientului la fel, deja depășite, Page.
Cea mai bună abordare este să utilizați direct protocolul HTTP utilizând funcția antet PHP. este echivalent cu cele două metaetichete de mai sus:
Putem merge cu un pas mai departe folosind antetul Cache-Control. compatibil cu browserele care acceptă HTTP 1.1:
Acest lucru asigură că niciun browser web sau server proxy intermediar nu va memora pagina în cache, astfel încât vizitatorii să primească întotdeauna cea mai recentă versiune a conținutului. De fapt, primul antet trebuie să fie autosuficient, aceasta este cea mai bună modalitate de a vă asigura că pagina nu este stocată în cache. Antetele Cache-Control și Pragma sunt adăugate cu scopul de "hedging". Deși nu funcționează în toate browserele sau proxy-urile, ele vor prinde câteva cazuri în care Expires nu funcționează corect (de exemplu, dacă data de pe computerul client nu este instalată corect).
Desigur, o încetare completă a caching-ului ne oferă problemele pe care le-am discutat la începutul acestui capitol. Acum vom analiza soluția acestor probleme.
Internet Explorer și descărcarea fișierelor cache
Discuția noastră despre PDF, prezentată în Capitolul 3, Tipuri de conținut alternativ, a explicat că pot apărea probleme atunci când aveți de-a face cu cache-ul și descărcarea fișierelor. În cazul în care serviciul de încărcare script PHP fișier folosit astfel de antete, cum ar fi Content-Disposition: atașament, nume de fișier = myFile.pdf sau Content-Disposition: inline, nume de fișier = myFile.pdf. veți avea probleme cu Internet Explorer, dacă îi spuneți browserului să nu cacheze pagina.
Internet Explorer funcționează într-un mod destul de neobișnuit, efectuând două solicitări pe site-ul Web. Prima interogare încarcă fișierul și îl salvează în memoria cache până când se creează a doua solicitare (fără salvarea răspunsului). Această interogare determină procesul de transfer de fișiere către utilizatorul final în funcție de tipul fișierului (de exemplu, acesta pornește Acrobat Reader dacă fișierul este un document PDF). Aceasta înseamnă că, dacă ați trimis anteturi care împiedică browserul să cacheze pagina, Internet Explorer va șterge fișierul între prima și a doua solicitare, rezultând că utilizatorul final nu primește nimic. Dacă fișierul pe care îl dați scriptului PHP nu se modifică, una dintre cele mai simple soluții va elimina anteturile "caching interzicerea" din scenariu.
Manualul recomandă, de asemenea, adăugarea
// întotdeauna modificat
antet ("Ultima modificare:" .gmdate ("D, d M YH: i: s") "GMT");