Käyttäjäystävällisempi "ei löydy" -sivu

Tässä tulee pitkästä aikaa nörttikirjoitus oikein viimeisen päälle, mutta uhrasin säätämiseen ja ihmettelyyn niin monta tuntia, että täytyy kirjoittaa tulokset muistiin, jos vaikka joku muu sattuisi tarvitsemaan.

Uusimmassa MovableType -versiossa on muutettu erikoismerkkien, kuten ääkkösten, käsittelyä kategoria- ja permalink-nimissä siten, että kun ääkköset aiemmin pudotettiin nimistä kokonaan pois korvattiin äänneyhdistelmillä (ä->ae, ö->oe), niin nyt ne korvataan äänneyhdistelmillä (ä->ae, ö->oe jne.) vastaavilla pilkuttomilla aakkosilla (ä-a, ö->o). Tämä on sinänsä ihan kelpo ratkaisu, mutta saattaa rikkoa sivujen pysyviksi tarkoitettuja osoitteita, mikä on kovin harmillista.

Muutoksen ei pitänyt dokumentaation mukaan koskea aiemmin kirjoitettuja yksittäisten kirjoitusten tiedostonimiä, mutta ilmeisesti nekin ovat jossain uudelleengenerointivaiheessa valahtaneet uuteen muotoon. Muutin käsin suurimman osan omissa kirjoituksissani esiintyneistä vanhoista linkeistä, mutta viitteitä noihin vanhoihin kirjoituksiin on tietysti vaikka kuinka ympäri nettiä, eikä mitään yksinkertaista paluutapaa vanhoihin tiedostonimiin ollut. Turkanen.

Vähin, mitä voin tehdä, oli yrittää tehdä puuttuvaan sivuun törmääminen mahdollisimman pehmeäksi. Samalla tuli palautettua mieleen ja hieman opiskeltua lisääkin mm. Apache-palvelimen mod_rewrite -magiaa, jonka avulla sivupyyntöjen osoitteita saa muunnettua lennossa toisennäköisiksi.

Näitä .htaccess-nimisiin ohjaustiedostoihin kirjoitettavia sääntöjä on netti pullollaan, enkä ryhdy tässä varsinaista tutoriaalia kirjoittamaan, aivan perusteita mod_rewrite:n käyttämisestä voi suomeksi lukea vaikkapa Kapsi ry:n sivustolta. Säännöllisten lausekkeiden käsittely on syytä olla hanskassa, muuten noista ei tule hullua hurskaammaksi.

Tässä tapauksessa homman avain oli opastaa palvelin näyttämään tavanomaista “404 Not found” -sivua käyttäjäystävällisempi virheilmoitussivu, mikäli osoitteen viittaamaan sivua ei sivustolta löydy. Tämä on onneksi helppoa, lisätään vain .htacceess-tiedostoon rivi:

ErrorDocument 404 [virhesivun_polku]

Eli minun tapauksessani web-dokumenttihakemiston juuressa sijaitsevaan 404.php-tiedostoon ohjaava käsky:

ErrorDocument 404 /404.php

Tämän jälkeen sivun puuttumistapauksessa (HTTP-virhekoodi 404) näytetään käyttäjälle tuon 404.php-tiedoston php-tulkin läpi parsittu sisältö. Tuohon 404.php-tiedostoon kirjoitin pahoittelevan virheilmoituksen ja tekstikentän hakukoneen polkaisemiseksi käyntiin. Mutta vielä hieman enemmän oli mahdollista jeestata linkkimädän uhriksi joutuneita käyttäjiä, tuumin, ja viritin sivulle hieman lisälogiikkaa.

Pahiten kärsineet yksittäisiin kirjoituksiin osoittavat permalink-osoitteet ovat blogisssani muotoa

/[vvvv]/[kk]/nhty_joku_leffa.php

joka oli nyt muuttunut muotoon

/[vvvv]/[kk]/naehty_joku_leffa.php

tai

/[vvvv]/[kk]/nahty_joku_leffa.php

Tällöin tyypillisessä tapauksessa osoite menee oikein vuosi- ja kuukausihakemistoihin saakka, eli osoitteesta pystytään kaivamaan todennäköisin kuukausiarkisto, jossa kirjoitus majailee. Seuraavassa pätkä koodia 404.php-tiedoston tuottavasta MovableType-template -tiedostosta. Koodinpätkän avulla luodaan linkki kuukausiarkistoon, mikäli puuttuvan tiedoston polku on yhtään tolkullinen:

<h1>Valitettavasti sivua ei löytynyt</h1>
<p>Seuraamasi linkki on mahdollisesti väärin kirjoitettu tai kyseisen sivun osoite                           
<?php
    $uri = substr($_SERVER['REQUEST_URI'],1);    // Huom. 1
    echo '<$MTBlogURL$>'.htmlspecialchars($uri).' on muuttunut.</p>';
    $pattern = '/^([0-9]{4}\/[0-9]{2}\/).*$/';    // Huom. 2
    $matches = array();
    preg_match($pattern,$uri,$matches);
    echo '<p>Voit etsiä kirjoitusta ';
    if (isset($matches[1]) && file_exists($matches[1].'index.php')) {    // Huom. 3
        echo 'kyseisen kuukauden ';
        echo '<a href="<$MTBlogURL$>';
        echo htmlspecialchars($matches[1]);
        echo 'index.php">arkistosta</a> tai ';
    }
    echo 'hakukoneella koko sivustolta:</p>';
?>

Alkuksi (huomautus 1) otetaan sivun pyyntöosoite käsittelyyn ja ensimmäisenä merkkinä esiintyvä kauttaviiva pois. Sitten tulostetaan puuttuneen sivun osoite varautuen siinä mahdollisesti esiintyviin, HTML-kielessä varattuihin merkkeihin.

Seuraavaksi testataan, esiintyykö osoitteessa merkkijonoa, [vvvv]/[kk]/, eli esimerkiksi 2007/01/ (huomautus 2). PHP:n preg_match -funktio kaivaa ensimmäisen mahdollisesti löytyneen osuman match-nimisen taulukkomuuttujan arvoiksi siten, että ensimmäinen patternissa esiintyvä kaarisuluilla erotettu osa tulee taulukon toiseen sarakkeeseen(indeksi 1), toinen sulkuparin sisältö kolmanteen sarakkeeseen (indeksi 2) jne. Ensimmäiseen sarakkeeseen tulee koko osuman sisältävä merkkijono. Tässä tapauksessa kaasulkupareja on ehdossa vain yksi, joten riittää osuman tarkastamiseksi testata onko sille asetettu arvo.

Kolmannella huomatusmerkinnällä merkityssä kohdassa testataan yllä olevan ehdon lisäksi vielä, että kyseistä vuotta ja kuukautta vastaava arkistotiedosto löytyy, ja tulostetaan positiivisessa tapauksessa linkki kyseiseen tiedostoon.


Tähän kirjoitukseen voi viitata TrackBack-osoitteella: http://kuvitelmaa.net/cgi-bin/mt/mt-tb.cgi/362

2 Kommenttia Tämän kirjoituksen kommenttien Atom-syöte

Mutta osaatko kertoa, kuinka saisi pysyvästi säädettyä niin, että ääkkösistä ei tulisikaan mainitsemallasi tavalla ä->ae, ö->oe jne., vaan ä->a, ö->o jne.? Ärsyttää aika vietävästi fiksailla nimiä käsin.

Ja ärsyttää sekin, että MT välillä ihan mielivaltaisesti muuttaa merkinnän linkin (jos kirjoitusta vaikka editoi jälkeenpäin tai erehtyy esikatselutilaan), mikä tarkoittaa sitä, että pahimmillaan yhteen merkintään voi olla kolmekin osoitetta. Mrr.

Joo, nyt kun tarkastelin tilannetta uudelleen, niin asia vaikuttaakin hieman monimutkaisemmalta. Nykyinen versio (3.34) näyttää sittenkin tekevän basename-muunnoksen siten, että ä->a ja ö->o. Jossain vaiheessa vanhojen entryjen basename vaan on vaihtunut tuoksi haemaelaenen-suomeksi :-/

Tuohon saattavat vaikuttaa valittu merkkikoodaus (PublishCharset mt-config.cgi:ssä, oletus on utf-8, minulla ISO-8859-15), valittu kieli (DefaultLanguage mt-config.cgi:ssä, minulla fi_FI), ehkä myös tietokannan encoding (minulla mysql:n iso-latin-swedish).

Valitettavasti helpot säätömahdollisuudet taitavat olla melko vähissä, sillä tuo muunnos on tehty MT:n perl-koodissa (mt/lib/MT/Util.pm).

Jätä kommentti


Kuukausiarkistot

Syötteet (feeds)

Creative Commons License
Tämän blogin sisältöön sovelletaan Creative Commons lisenssiä.

Kiitokset

Spämmitorjunnan tarjoaa Akismet

Flickr-integrointi: phpFlickr

Jaiku-integrointi: Services_JSON

Sirkusta pyörittää Movable Type Open Source (MTOS) 4.1

Valid XHTML 1.0 Strict Valid CSS!

Valokuvat Flickr-virran Atom-syöte

NangilimaVapaustaisteluKatlan luolaanValta Tengilille!SaalisSudet
Enemmän kuvia Flickr-galleriassani.
Näytä kuvat kartalla Flickr map,Google Maps tai Google Earth (kml)

µblogi@Jaiku Jaiku-virran Atom-syöte

Ei Jaikuja viimeisen kahden vuorokauden aikana.

Muualta poimittua Atom-syöte

Kiinnostavia keikkoja Atom-syöte

Valinnat: Ilkka Rinne ja Anna Ruhala

    Muita musiikitapahtumia: Meteli.net/Helsinki

    Täyskokoiseen kalenteriin
    Miten kummassa Google Kalenterista saa tapahtumia tällä lailla ulos?