Mozillan toiminta web-sivujen esihaussa

Mozilla-selaimen versiossa 1.2 ja sitä uudemmissa on mukana esihaku, joka mahdollistaa sivujen hakemisen taustalla samalla aikaa, kun käyttäjä vielä lueskelee edellistä sivua. Tässä jutussa kuvataan Mozillan esihaun toimintatapa erityisesti www-sivujen tekijän näkökulmasta. Jos esihaku ei käsitteellisesti ole tuttu, kannattaa ennen tämän sivun lukemista tutustua yleisesitykseen www-esihausta.

Mozillan esihaun (prefetch) toiminta perustuu siihen, että www-sivujen tekijä voi määritellä, mitkä sivut esihaetaan. Selain ryhtyy hakemaan määriteltyjä sivuja taustalla, kun varsinainen näytettävä sivu on latautunut valmiiksi. Esihakujen valmistuttua niiden tulokset tallennetaan selaimen välimuistiin, josta ne näytetään käyttäjän tarvitessa esihaettua dokumenttia. Jos käyttäjä klikkaa jotain linkkiä ennen kuin esihaut ovat valmistuneet, haut keskeytetään ja osittain ladatut sivut tallennetaan välimuistiin.

Mitä esihaetaan?

Mozilla esihakee ne dokumentit, jotka on dokumentissa määritelty sopivilla link-elementeillä tai vastaavilla HTTP-otsakkeilla. Link-elementeistä esihaetaan ne, joiden rel-attribuutti sisältää arvon prefetch tai next. Next-suhteessa olevien dokumenttien hakemista voidaan perustella sarjamuotoisten dokumenttien esihakemisen tehokkuudella. Prefetch-suhde taas mahdollistaa minkä tahansa tiedoston määrittelyn esihaettavaksi. Sivu saattaisi alkaa esimerkiksi seuraavasti:

<html>
  <head>
    <title>Kuvia hilavitkuttimista</title>
    <link rel="next" href="kuvat2.html">
    <link rel="prefetch" href="hila1iso.jpg">
  </head>
  <body>
    ...

Esimerkissä esiladattaisiin seuraava kuvasivu ja hila1iso.jpg-niminen kuva (tämä voisi olla esimerkiksi linkitettynä pikkukuvasta, jolloin pienen kuvan klikkaaminen johtaisi ison kuvan avautumiseen ilman odotteluja).

On hyvä muistaa, että link-elementin rel-attribuutin arvo on välilyöntieroteltu luettelo niistä suhteista, joissa linkitetty olio on nykyiseen dokumenttiin. Niinpä näitä määreitä on myös mahdollista yhdistää: rel="prefetch alternate stylesheet" määrittelee siis esihaettavan vaihtoehtoisen tyylitiedoston. Vastaavasti myös minkä tahansa muun link-elementillä ilmaistun suhteen voi myös saattaa esihaun piiriin. Esimerkiksi <link rel="prefetch index" href="sisalto.html"> kertoisi, että dokumentilla on hakemisto nimeltä sisalto.html, joka esihaetaan.

Prefetch-määreiden yhdistelyssä on kuitenkin syytä olla varovainen. Kaikkien selainten tuki välilyöntierottelulle ei välttämättä ole täydellinen, ja jotkut rel-attribuuteille vakiintuneet arvot (esim. ns. faviconin määrittelyyn käytetty "shortcut icon") rikkovat rel-attribuutille HTML-spesifikaatiossa määriteltyä muotoa. Tämän vuoksi selainten toiminta joidenkin rel-määreiden yhdistelmien kanssa on jossain määrin epävarmaa.

HTML-sivulle upotettavien link-elementtien lisäksi esihaku voidaan määritellä suoritettavaksi myös (yleisemminkin Link-elementtiä vastaavilla) HTTP-otsakkeilla. Tämä on tärkeää mm. siksi, että jos dokumentti on muuta kuin HTML:ää, siihen ei luonnollisesti voi upottaa link-elementtejä sellaisenaan. Kuitenkin esim. PDF-asiakirjassa voi hyvinkin olla linkkejä, joiden esihakeminen saattaa olla järkevää.

Link: <kuvat2.html> rel=next
Link: <kuvat2.html> rel=prefetch

Mozilla-projektissa on keskusteltu myös siitä, pitäisikö esihaku mahdollistaa HTML:n A-elementistä lähtien (jotta voisi esimerkiksi kirjoittaa <a href="omasivu.html" rel="prefetch">...</a>. Tässä menetelmässä olisi kiistatta hyvät puolensa sivujen teon ja ylläpidon helppouden puolesta, mutta toistaiseksi toiminnallisuutta ei ole vielä toteutettu.

HTTP-otsakkeiden asettamiseen tarvittavat tekniikat vaihtelevat palvelinkohtaisesti. Esimerkiksi PHP-kieltä tukevissa ympäristöissä voi käyttää header()-funktiota.

Haun rajoitukset

Mozillan esihakua on edelläkuvatuista yleisistä säännöistä rajoitettu siten, että sivuja, joiden osoitteessa esiintyy kysymysmerkki (?), ei haeta. Tämä perustuu siihen, että varsinkin next-relaatiossa on joissain web-palveluissa koneellisesti generoituja sivuja (joiden osoitteeseen ?-erotin tyypillisesti kuuluu), joita ei monestikaan voida tallentaa välimuistiin. Näin säästetään palvelinten kuormaa. Toisaalta varjopuolena on se, että niissä tilanteissa joissa kysymysmerkin sisältävän urlin takana olevien sivujen hakeminen olisi järkevää, se ei onnistu. Mozilla-projektissa on keskusteltu siitä, että esihaku voitaisiin hyväksyä prefetch-kontekstissa kysymysmerkeistä huolimatta; prefetch-tunnistetta kun ei ole aiemmin käytetty, sen esiintyminen sivuilla osoittaisi joka tapauksessa ylläpitäjän tietoista valintaa sivun esihaettavuudesta. Tästä keskustelusta ks. Mozillan bugiraportti 185692.

Edellä kuvattua rajoitusta voidaan hyödyntää siten, että mikäli jokin next-relaatiossa oleva osoite on epäsopiva esihakua silmälläpitäen, kysymysmerkin liittäminen sen osoitteeseen estää esihaun toiminnan Mozillassa. Näin esimerkiksi <link rel="next" href="iso.html?"> ei aiheuttaisi esihakua.

Edelleen Mozillan esihakua rajoittavat protokollamääreet. Tällä hetkellä Mozilla esihakee vain http-sivut; perusteina on todettu, että muut protokollat eivät tarjoa riittävän tuhtia tukea tulosten cachettamiselle, jotta esihaku voisi toimia luotettavasti. HTTPS-urlien päässä olevaa materiaalia ei haeta turvallisuussyistä.

Esihakuominaisuuden käyttöönoton jälkeen on esitetty myös ajatus siitä, että next-relaatiossa oleva dokumentti haettaisiin vain, jos käyttäjä on tullut sivulle osoitteesta, joka ilmenee prev-relaatiosta (ja päinvastoin). Tällöin haut voitaisiin rajata siten, että sarjamuotoisissa dokumenteissa esihakua käytettäisiin vain, jos käyttäjä näyttää seuraavan sarjaa. Toistaiseksi logiikkaa ei kuitenkaan ole vielä toteutettu; ks. bugiraportti 175418.

Esihakupyyntöjen tunnistaminen

Mozillan tekemät esihakupyynnöt voidaan tunnistaa siitä, että niissä on mukana HTTP-otsake X-moz: prefetch. Tätä otsaketta ei luonnollisestikaan ole mitenkään standardoitu, joten toteutus voi muuttua myöhemmissä versioissa. Lisäksi on huomattava, etteivät kaikki välimuistit välttämättä välitä otsaketta moitteettomasti eteenpäin.

Aivan ensimmäisiä esihakuversioita lukuunottamatta Mozilla lähettää esihakupyyntöjen yhteydessä myös Referer-otsakkeen, jolloin palvelinten on periaatteessa mahdollista päätellä myös se, mikä sivu esihakupyynnöt generoi. Tätä toimintoa voidaan jossain määrin käyttää ongelmallisten kuormahäiriöiden ym. alkuperän selvittämiseen.

Esihaun kytkeminen pois päältä

Mozilla-projektissa on keskusteltu siitä, miten esihaun poiskytkemiseen pitäisi suhtautua. Tällä hetkellä esihaku on oletusarvoisesti päällä, ja sen poiskytkeminen vaatii asetustiedoston editointia. Ohjeet tästä löytyvät esimerkiksi mozilla.orgin Link Prefetching FAQ:sta.

Keskustelua esihaun poiskytkennän liittämisestä käyttöliittymään löytyy mm. bugiraportista 166648. Lisäksi on pohdittu mahdollisuutta rajoittaa esihakua käytetyn siirtokaistan mukaan (ks. bugiraportti 175403).

Jouni Heikniemi
25.1.2003

Tämä dokumentti kuuluu sivujeni osioon
Kirjalliset tuotokset / Tietotekniikka.