Práca s Apache - mod-rewrite v .htaccess

Práca s Apache - mod-rewrite v .htaccess

Ak chcete aby URL vo vašej aplikácií či weblogu pôsobili na užívateľov dobre a prospievali vašej stránke zo strany vyhľadávačov používajte mod-rewrite.

Možno ste sa už stretli zo zaujímavými adresami URL napr. aj v tomto magazíne. Predpokladám, že nikoho nenapadne odkiaľ pochádza zdroj URL resp. aký skript práve spustil koncový užívateľ. Cieľom tohoto článku bude jednoduchá zmena URL na jej vylepšenú formu, čiže konečný výsledok by mal vplývať lepšie na vyhľadávače , užívateľa a celkový dojem zo stránky.

Ako začať?

Nebudem sa zameriavať priamo na nastavenie mod-rewrite na localhost ale budem pracovať rovno s hotovým nastavením. Obyčajne by však malo stačiť odkomentovať modul #modrewrite. Ako prvé vytvorím PHP kód, ktorý je sám zdrojom pre dlhé a škaredé URL adresy. Nasledujúci kód by mal takýto typ adresy zabezpečiť.

<?php #index.php
 if(isset($_GET['id'])){
     if(is_numeric($_GET['id'])){
           echo "<p>Toto je článok číslo {$_GET['id']}</p>n";
     } else {
           die("<p>Nesprávny formát id</p>n");
     }
 }
?>

Po spustení skriptu skúste zadať url v tvare index.php?id=3. V momente bude do prehliadača zaslaný HTML kód a na strane užívateľa uvidíte výpis:

Toto je článok číslo 3

Vytvárame súbor .htaccess

Vytvorte si súbor .htaccess. Väčšinou by nemali nastať pri vytváraní tohoto súboru žiadne problémy ale sem tam sa môže vyskytnúť problém keď sa tento súbor vytvoriť nedá vôbec a to konkrétne v systémoch Windows. Pokiaľ tento problém u vás pretrváva skúste si ho vytvoriť, tak že ho rovno uložíte pomocou nejakého editoru alebo si ho stiahnite cez FTP.

Zapísanie pravidiel prepisovania URL

Ak už máme vytvorený súbor .htaccess môžeme začať s písaním pravidiel pre prepisovanie URL. V našom prípade sa pokúsime zmeniť napr. adresu index.php?id=3 na clanok3.html. Nenechajte sa zmiasť tou 3. Môže tam byť akékoľvek číslo ale nie písmeno. To by ste však už mali ovládať ak si prezriete PHP kód.

Do súboru zapíšte nasledujúce pravidlá:

RewriteEngine on
RewriteRule clanok(.*)\.html$ index.php?id=$1

Pomocou RewriteEngine s atribútom "on" sme zapli mod-rewrite a nasledovné RewriteRule je definované pravidlo pre prepísanie našej adresy. Adresa index.php?id=$1 bude zmenená do tvaru clanok(.*).html.

Na čo si dávať pozor?

Predovšetkým sa nehrajte s .htaccess až natoľko, že vám stránka nebude fungovať. Pri akejkoľvek chybe v syntaxi bude koncový užívateľ presmerovaný na chybu 500. Čiže si môže myslieť, že stránka neexistuje. Toto by ste si ale pri editácií asi mali ihneď všimnúť. Záleží to však aj na nastavení súboru httpd-conf či sa užívateľ dostane tam kam vy nechcete.

URL adresa prepísaná

Teraz keď už súbor index.php a .htaccess je uložený v koreňovej zložke môžeme si vyskúšať do prehliadača zadať adresu index.php?id=25 a následne vyskúšame do prehliadača zadať aj adresu clanok25.html. Takto sa dajú meniť aj rôzne dlhé URL adresy.

Mod-rewrite je skvelá vec. Teraz sú v príprave články o .htaccess kde bude popísané mnoho o jeho možnostiach. Samozrejme netreba si spájať mod-rewrite a .htaccess, pretože sú to v podstate dve rôzne veci. Súbor .htaccess len použitie mod-rewrite sprostredkúva a mod-rewrite je len jedna malá ryba v rybníku, ak by som to mal prirovnať k počtu modulov na Apache.

Alternatívne verzie: Text PDF Voice
Autor: PaBi3 · Kategória: Programovanie · Dátum: 15.09.2005 17:38

Komentáre

#1 pico E-mail
20.05.2006 11:57
ked nastavim .htaccess podla tohoto, tak mi server pise "You don't have permission to access /vyvoj/mod_rewrite/ on this server."
ak odstranim .htaccess tak mam pravo.
v com moze byt problem ?

#2 admin Web E-mail
21.05.2006 18:59
admin Pravdepodobne je problem v nastaveniach Apache. Skus si nastavit polozku AllowOverride na AllowOverride All.

#3 javo Web E-mail
05.03.2007 15:04
srry ze davam takuto otazku, raz som ju uz sem posielal ale pravdepodobne bola zmazana a uz nikde na nete neviem najst odpoved,
a potrebujem to zase,
a tykalo sa to db , ako pracuje napr tato stranka,
mam adresu
http://test.cz/produkt.php?kod=3

iste mozem ju prepisat na test.cz/kod/3 alebo nieco podobne, len pre SEO by bolo idealne aby bol nazov produktu v url, a ten mam v db,
ako teda nato ?

//skusal som hladat vsade aj minulu odpoved co som tu dostal ale nic mno

diki

#4 admin Web E-mail
05.03.2007 19:59
admin [3] javo, otázka určite nebola zmazaná. Je nutné ukladať názov produktu do špeciálneho stĺpca v DB.
CREATE TABLE produkty (
`id` INT UNSIGNED NOT NULL auto_increment PRIMARY KEY,
`url` VARCHAR(160) NOT NULL,
...
);

Stĺpec URL bude obsahovať reťazce ako napr. moj-oblubeny-produkt.

#5 javo Web E-mail
05.03.2007 21:06
mno a ked to vytvorim ako bude vyzerat .htaccess? lebo prave to neviem ,
inu nedalo by sa to nejako inak ? lebo mam vyse 120 produktov a kazdemu vzdy priradovat url ... :( ,
napr. keby som dostal adresu
http://test.cz/produkt.php?kod=3&produkt=aloevera
ako to prepisem cez .htaccess , skusam navody ale akosi mi idu len tie jednoduchsie, ani by som neotravoval ale mam cas si to pozriet cez vikend a potrebujem to co najskor,
inu fakt diki za ochotu

#6 admin Web E-mail
06.03.2007 07:50
admin Napríklad takto:
RewriteEngine On
RewriteRule ^produkt\/([0-9]{1,})\/([a-zA-Z0-9]+)\/$ test.php?kod=$1&produkt=$2


Keď ti to nepôjde, vyskúšaj si dať pred test.php lomítko.

#7 javo Web E-mail
06.03.2007 22:28
diki uz som to nejako poriesil , sice bez toho stlpca v db , lebo to by som musel vela dospiovat, ale uz to ide v poho , teda dufam ze SEO nebude vadit ze mam v url %20 , este raz dik

#8 Johny694 Web E-mail
27.12.2007 19:34
A nevieš plz ako to mám dať
v
RewriteEngine on
RewriteRule clanok(.*)\.html$ index.php?id=$1

ked nemam v premenej id=$1 cislo ale text? napr. index.php?id=zbrane

#9 admin Web E-mail
27.12.2007 21:18
admin Takto:
RewriteRule clanok([a-zA-Z0-9]+)\.html$ index.php?id=$1
Prípadne je nutné doplniť ďalšie znaky, ktoré by sa v tom texte mohli objaviť (pomlčky, bodky...).

Osobné údaje
Captcha
Odpíšte text z obrázku. Rozlišujú sa malé a veľké písmená.
Obsah
Možnosti