S přechodem na nový software webu se objevil zajímavý problém. Vyhledávače na Internetu znají mají indexovány odkazy a cesty ke stránkám. Ty se ale s přechodem změnily a všichni návštěvníci rázem končí na hlavní stránce. Je fakt, že při plánování migrace mě to nenapadlo. Zjistil jsem to vlastně až z logů webu.
Problém je možné nechat vyšumět. Prostě počkat, až si vyhledávací roboti projdou novou podobu stránek a zaindexují nové odkazy. To ale trvá a pro návštěvníka je nekomfortní. Další možností je přesměrování požadavků pomocí modulu mod_rewrite. Touto cestou jsem se vydal i já.
Nechci popisovat vlastnosti a možnosti modulu. Takových článků je na Internetu mnoho. Pěkný seriál je třeba na stránkách JavaScript Kit. Příspěvek je orientován spíš na popis řešení dané situace.
Z Google Webmaster Tools jsem si nechal vypsat stránky, které jsou indexované v databázi. Tím jsem získal seznam URL pro přepisovací pravidla. Vyřadil jsem všechny starší příspěvky a pro zbytek napsal jednoduchá přepisovací pravidla.
Všechna pravidla jsou uložena v souboru .htaccess v kořenovém adresáři webu. Přepisovací mód je zapnut direktivou RewriteEngine. Direktivou RewriteBase je nastaven kořen od kterého bude přepisování prováděno.
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /
Poté následují jednotlivá pravidla a podmínky. Přepisování jsem vyřešil pomocí direktiv RewriteCond a RewriteRule. RewriteCond zjistí, jakou stránku uživatel požaduje. Direktiva má následující syntax:
RewriteCond typ_výrazu výraz
Netestuji celé URL, protože jméno ani adresa serveru se neměnila. Zajímá mě pouze požadovaná cesta ke stránce. Typem testovaného výrazu je tedy QUERY_STRING. Výrazem je pak významná část „adresy“ stránky. Cesta ke stránce nemusí být uvedena celá, lze používat regulární výrazy.
RewriteRule poté provádí samotné přesměrování a má následující syntax:
RewriteRule požadovaná_stránka výsledná_stránka nepovinné_příznaky
Stejně jako u předchozí direktivy, je možné i zde požadovanou stránku popsat regulárním výrazem. Nepovinné příznaky určují, zda jde o přepis, přesměrování, zda pokračovat dalšími pravidly …atd.
Příklad:
- Na původním webu měl článek URL /index.php?text=16-letecka-mapa-pro-garmin-gps
- Na novém je adresa /index.php?p=18
Uživatel stránku dostane jako /18/letecka-mapa-pro-garmin/. To je zajištěno dalším přepisem, který je prováděn automaticky pro všechny články.
Přepisovací pravidla pro tento případ vypadají takto:
# puvodni url index.php?text=16-letecka-mapa-pro-garmin-gps
RewriteCond %{QUERY_STRING} ^.*text=16-letecka-mapa-pro-garmin-gps.*$
RewriteRule ^index\.php$ http://jentak.draci.org/index.php?p=18 [L]
Pravidlo lze zjednodušeně interpretovat takto:
Pokud uživatel požaduje stránku, jejíž url obsahuje text text=16-letecka-mapa-pro-garmin-gps přepiš adresu na http://jentak.draci.org/index.php?p=18 (proveď přesměrování)
Příznak L znamená, že zde se přesměrovávání zastaví a další pravidla nejsou pro tento případ zkoumána a uplatněna. Protože články na starém a novém webu mají různá ID, nelze použít skupiny v regulárních výrazech.
Pro zjednodušení používám přesměrování na celé URL. Prostě proto,
že mi to funguje. ![]()
Asi by to šlo dělat i lépe. Takhle to pracuje spolehlivě a pro těch pár článků, pro které to mám udělané toto řešení stačí.
Zdroje dalších informací
- mod_rewrite – dokumentace modulu
- JavaScript Kit – článek o .htaccess
Související články:
Žádné nejsou.