URL routing megvalósítása statikus generálású weboldalakon

A szépen strukturált, beszédes URL címek nem csak a látogatók számára mesélik el az éppen letöltött tartalom pontos helyét a honlapon, hanem releváns szavakkal kiegészítve, a kereső robotok munkáját is segítik. Tudatos munkánkat pedig magasabb keresési relevanciával jutalmazzák. Ezért a használatukról még egy statikus generálású honlap kedvéért sem érdemes lemondani.

A hagyományos, CMS alapú weblapok esetében az URL címek konkrét web tartalomhoz való kapcsolását egy szerver oldali komponens, egy routing vagy dispatcher service végzi el. De mit tehetünk akkor, ha a honlap ilyennel nem rendelkezik, mert történetesen egy statikus generálású oldalról van szó? Az Apache 2 web kiszolgáló mod_rewrite modulja megmutatja, hogy van élet a PHP routing service-ek teljes elhagyása után is.

A mod_rewrite modul az Apache futás idejű URL elemző modulja. Reguláris kifejezésekkel lehet benne URL átirányításokat indítani, illetve módosítani azokat a szabályokat, amelyekkel az URL címek kerülnek leképzésre az állományrendszerre megfelelő helyére. Röviden: fekete mágia a fejlesztők és a rendszerüzemeltetők kezében.

A megoldásunk alapja a mod_rewrite modul

Ezzel a sokoldalú Apache modullal egy alap routing megvalósítása igazán gyerekjáték. Központi eleme a tárterület publikus gyökérkönyvtárába elhelyezett .htaccess állomány, ebbe kerültek bele a kívánt szabályok.

A tartalomgenerátorunk minden web tartalmat, beleértve a statikus HTML5 állományokat is egy-egy alkönyvtárba helyez el. Az oldalak esetében ez egy /pages nevű almappa. A routing feladata jelen esetben, hogy minden szép URL címet egy ezen könyvtár alatt létező HTML állományhoz kapcsoljon. A mod_rewrite modullal a web szerver alapszolgáltatásával valósítottuk meg a szükséges szabályokat, így azokhoz nem volt szükségünk további szerver oldali modulokra (pl. PHP) vagy szerver oldali web alkalmazásokra (pl. CMS).


Az alábbi szabályokat egy éles, statikus generálású honlap projektjéből emeltük ki.

Alapértelmezett kezdőoldal megadása

A Google többnyelvű oldalakhoz készített ajánlását is követve a weboldal alapértelmezett nyelvének főoldala közvetlenül a domain név, mint URL cím alatt jelenik meg. Tehát egy olyan routing szabályra volt szükségünk, amely hiányzó oldalhivatkozás esetén közvetlenül a főoldal állományát adja vissza a pages/ almappából.

RewriteCond %{REQUEST_URI}  "^/$"
RewriteRule ^(.*)$ "pages/hu.html" [L]

Létező oldalakra mutató URL hivatkozások

A szép URL címek koncepciója megköveteli a címek strukturált kialakítását is, például:

http://honlap.hu/szolgaltatasok
http://honlap.hu/szolgaltatasok/adotanacsadas
http://honlap.hu/szolgaltatasok/adotanacsadas/adojogi-kepviselet

Amennyiben létezik az URL címhez statikus HTML állomány a pages/ mappa alatt, érvényre jut az alábbi routing szabály és visszaadja az állomány tartalmát.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} ^(.*)/*$
RewriteCond %{DOCUMENT_ROOT}/pages/%{REQUEST_URI}.html -f
RewriteRule ^(.*)/*$ "pages/$1.html" [NC,L]

Nem létező URL hivatkozás esetén a legközelebbi kapcsolódó tartalom kikeresése

A strukturált URL címek, illetve a hozzájuk kapcsolódó, szintén strukturáltan tárolt statikus HTML állományok lehetővé teszik az olyan routing szabályok létrehozását is, amely nem létező címek esetén kikeresik az első létező szülő-oldalt és azt jelenítik meg.

Pl. a nem létező http://honlap.hu/szolgaltatasok/froccsontes hivatkozást átirányítja a létező, kapcsolódó http://honlap.hu/szolgaltatasok hivatkozásra.
RewriteCond %{REQUEST_URI} (.*)/([^\/]*)$
RewriteRule ^(.*)/([^\/]*)$ "/$1" [R=301,L]

Így ez az átirányítási szabály is implementálásra kerülhetett a statikus generálású honlapon.

Egyedi 404 hibaoldal

A teljesség igénye mellett egy 404-es hibaoldal is beállításra került, amely akkor jut érvényre, ha egyik korábbi szabályra sem illeszkedett az URL cím.

ErrorDocument 404 /404.html

Direkt HTML állományok elérésének tiltása

Nem lenne célszerű, ha statikus HTML állományokat a routing szabályokat megkerülve is meg lehetne hivatkozni, mivel ezáltal duplikált tartalmak jönnének létre a honlap domain neve alatt. Ezért ezeket érdemes a helyes (canonical) címre irányítani.

RewriteCond %{REQUEST_URI} pages/(.*)\.html$
RewriteRule ^pages/(.*).html$ “/$1” [R=301,L]

További URL cím kozmetika

Nem szeretjük a / jellel végződő URL címeket sem, ezeket pedig a / karakter nélküli címeikre irányítottuk.

RewriteCond %{REQUEST_URI} “(.+)/$”
RewriteRule ^(.+)/$ /$1 [L,R=301]

Végeredményben egy olyan többfunkciós routing modult kaptunk tisztán Apache mod_rewrite szabályok alkalmazásával, amely minden számunkra fontos funkciót megvalósított a statikus generálású weboldalunkhoz.

A teljes .htaccess állomány letölhető innen.