Keresőbarát, szép url-ek

Bizonyára már sokan törték a fejüket, hogy lehet pl. ehhez hasonló url-t készíteni:

http://oldalam.hu/cikkek/hogyan_keszithetek_szep_url/

Számtalan leírás és módozat van ennek kivitelezésére. Viszont egyik sem nyerte el tetszésemet, úgyhogy végül megoldottam magam. Most ezt szeretném veletek megosztani.

A gépemen futó kiszolgálói környezet: AppServ 2.5.10, amit itt letölthetsz: appserv-win32-2.5.10.exe

1. Apache beállítása, mod_rewrite engedélyezése

Első lépésként, ha még nem engedélyeztük Apache szerverünkön, hogy engedélyezze a mod_rewrite-t, nyissuk meg: C:\AppServ\Apache2.2\conf\ könyvtárban lévő httpd.conf nevű file-t.

Majd keressük meg ezt a részt:

1
2
3
4
5
6
#
# Dynamic Shared Object (DSO) Support
#
...
# LoadModule rewrite_module modules/mod_rewrite.so
...

Itt töröljük ki a hashmark-ot (#) a sor elejéről. Majd indítsuk újra az Apache-t. Ezzel engedélyeztük a mod_rewrite használatát.

2. .htaccess file elkészítése

Hozzunk létre egy .htaccess file-t, majd illesszük be ezt:

1
2
3
4
5
6
7
<IfModule mod_rewrite.c>
RewriteEngine on
Options +FollowSymLinks
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*) $1.php?rewrite=$2 [QSA]
</IfModule>

Ez a kis .htaccess annyit tesz, hogy minden kérést átirányít és két részre bont, az első ($1) tartalmazza a php file nevét, a második ($2) pedig az url többi részét. A rewrite változónak nincs gyakorlati jelentősége, mivel a feldolgozás során nem kérdezzük le. Csupán a .htaccess áttekinthetősége miatt tettem bele.

Fontos, hogy a .htaccess file mindig a gyökérkönyvtárban foglaljon helyet, de mivel AppServe-t használunk, jelen esetben ide kell tenni: C:\AppServ\www\oldalam\

3. PHP értelmező elkészítése

Most már nagyrészt működik is a szép url-es linkelés, de még létre kell hoznunk egy értelmező php kódot, amely minden egyes kérésnél az url-t feldarabolja, és egy asszociatív tömbben tárolja, majd a tömb elemeit tetszés szerint felhasználhatjuk a kódon belül.

1
2
3
4
5
6
//url kezelés
$subdir  = substr(realpath(dirname(__FILE__)), strlen(realpath($_SERVER['DOCUMENT_ROOT'])));
$tmp_array = explode('?', trim($_SERVER['REQUEST_URI']));
$uri = str_replace($subdir, '', $tmp_array[0]);
$uri = ltrim($uri, '/');
$URIParts = explode("/", $uri);

Ez a kód minden esetben a file legelején foglaljon helyet!

$URIParts tartalma így fog kinézni, ha kérés érkezik:

1
Array ( [0] =&gt; oldalam [1] =&gt; filenev [2] =&gt; parameter [3] =&gt; )

A kódon belül értelemszerűen így kezeljük a tömb elemeinek az értékeit, pl.:

1
2
$file = $URIParts[1];
$parameter = $URIParts[2];

A $file értéke az alábbi lesz: filenev. És a $parameter értéke: parameter lesz.

Remélem ezzel a kis leírással egyszerűen és érthetően szemléltettem, hogyan is készíthetünk “szép url-t” oldalunkra.

33 HOZZÁSZÓLÁS

  1. Hello d3x!

    Esetleg tudnál írni olyat is, amelyben nincs php feldolgozás, tehát csak mod rewrite van?
    (Teszteltem néhány példa cikk alapján a htaccess kódokat de egyik sem működött.)

  2. Szeva ADM!

    Igen, majd összeírok azokra is pár példát.

    Mit értesz az alatt, hogy nem müködik?

    Ha nem megy próbáld meg így összerakni a htaccess-t:

    5
    6
    7
    8
    9
    10
    11
    
    <IfModule mod_rewrite.c>
    RewriteEngine on
    Options +FollowSymLinks
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/(.*) $1.php?rewrite=$2 [QSA]
    </IfModule>
  3. Valamiért rosszul irta ki a kódomat, lehagyta az IfModule taget az elejéről és a végéről… :S

    Itt egy link ahol meg tod nézni, hogy néz ki: http://hirdet2.extra.hu/htac.txt

    Nem tudom, hogy miért de a kommentból lehagyta azt a részt. Bocsánat.

  4. Sziasztok,
    d3xter20 jelezte a problémát hogy módosítsam a cikket, most már ott is, illetve a hozzászólásában is jól jelenik meg a kód.
    További szép estét!
    Harder

  5. Sziasztok, nem tud valaki olyan php kódot ami ha nem megy a mod rewrite, (ugye free tarhelyen) ugyanezt megcsinálja? Elkezdtem írni a sajátomat, (igazábol egy get-es változó van, amiben /-el vannak elválasztva az adatok, ezt explodeolom, es keresem benne a paramétereket), de elég bugos valamiért (néha megy néha nem.. ), szóval ha valakinek esetleg van valami hasonlója, azt megvizsgálnám, vagy valami jobb megoldása (ötlete). :) köszi

  6. Szerintem free tárhelyen ne próbálkozz ilyennel. De lécci mutasd meg, hogy hogyan akarod megoldani a dolgot. Talán tudunk segíteni.

  7. Üdv ennyi idő távlatából:)

    Kérdésem lenne. WordPressnél .htaccess + mod_rewrite esetén pikpak megoldható a szép link, DE: úgy tudom, ez árt a SEO-nak, mert duplázás jön létre, ami kiküszöbölésére az a tanács olvasható több helyen is, hogy adjunk hozzá végződést, akár egyedit is, pl.: .html vagy .seo. Emlékszem egy cikkre a ködös múltból, vagy talán valahol megjegyzésként szerepelt, mindegy, szóval hogy a .htaccess használatával eltüntethetőek a végződések.

    Tehát a szép linkekhez seo-ellenesség nélkül jó az, ha kiterjesztést adok majd .htaccess-ben eltüntetem?

    És ha igen, támpontot kérnék, hogy nézhetnék jobban utána vagy hol.

    Ha már itt vagyok, megkérdem ezt is, hátha: WordPress SEO-zásához permalink téren elég a mod_rewrite és alap állíthatóság, vagy ekkor is szükséges plusz plugin a jobb eredményért? És ha igen, melyik?

    Köszönettel: Doenroy

  8. beraktam minden kodot az oldalamba (.htaccess, .php) de semmi nem tortent. tudnatok nekem segiteni, miert?
    koszonom

  9. Hello!

    Megmondom őszintén, hogy nem régen találkoztam ezzel a dologgal, és szégyellem is magam, mert nem ma kezdtem el a webes fejlesztést, na de ez nem lényeg…
    Lépésről, lépésre megcsináltam a dolgokat ahogy írtad, a PHP-s script le is fut a file elején, meg is jelennek az adatok, de az URL csak nem módosul.
    Természetesn apach-ban a mod_rewrite meg van hívva :)

    .htaccess file-t én még sosem írtam, és nem igazán tudom, hogy minek mi a funkcója, és mit kellene átírni, mert a pl-ben általánosan írtad le…na ezt jól megfogalmaztam :)

    Köszi előre is…

  10. …még csak annyi, hogy valahol azt olvastam, hogy a .htaccess file-okat Ascii-ben kell felmásolni, más különben nem fog menni.
    Ez igaz??? Ha igen, és tényleg lényeges, akkor a FlashFXP-ben hol lehet ezt beállítani, hogy megfelelő módon tudjam felmásolni…

    Thx

  11. A flashfpx – és tudtommal kb az összes többi ftp kliens is – ezt kezeli automatikusan, nem kell beállítani semmit. Számtalanszor másoltam fel/le .htaccess fájlt flashfxp-vel is, total commanderrel is, filezilla-val stb…. és nem volt gond emiatt.

  12. Üdv!

    Köszönet a cikkért, számomra hasznosnak bizonyult, szerintem nem csak szép, de a keresőoptimalizálásban is nagy jelentősége van egy értelmezhető url -nek.

  13. Egy autóalkatrész webáruházat készítek éppen, és szépen működik a fenti átirányítás, csak 1 problémám van. Ha pl, az URL így néz ki “/webaruhaz/citroen/berlingo”, akkor a webaruhaz.php dolgozza fel a paramétereket, viszont ott szeretnék a képekre relatív URL-eket haszbálni pl: “images/top_banner.jpg”, de ebben az esetben a “/webaruhaz/citroen/berlingo/images/top_banner.jpg” helyen keresi a böngésző. Volna erre valakinek ötlete, hogy kerülhetném el az abszolut URL-ek használatát ebben az esetben?”

    Attila

  14. @aty: vágd be ezt a gyökérben található .htaccess-be:

    1
    
    RewriteRule ^(.*)/images/top_banner.jpg$ images/top_banner.jpg [L]
  15. Hali!!!

    Először is köszönet a cikkért, valóban jó dolog a SEO-t szem elött tartva!!! Viszont az a kérdésem, hogy ez csak localhost alatt működik, vagy fizetős tárhyeleken is hazsnálható!!!??? Mert ez a .htaccess fájlhoz ott nem férek hozzá:) Vagy pedig ott alapba már úgy van beállítva, hogy ez használható? Vagy hol tudok ennek utánanézni???

    Válaszotokat mielöbb várom és köszönet érte!!!

  16. 1 hónappal megkésve: szerintem a fizetősök jó részén működik. Én 1 helyen próbáltam, ott jó.

  17. Warning: realpath() [function.realpath]: open_basedir restriction in effect. File(/usr/local/apache/htdocs) is not within the allowed path(s): (/home/:/usr/lib/php:/tmp) in /home/a9063999/public_html/001/index.php on line 2

    :( sajnos nem akar menni, pedig a szerveren be van állitva.

  18. Linux alá (localhoston) mit csináljak?
    Van egy httpd.conf file az /etc/apache2-ben, de tök üres.

  19. Debianon az /etc/apache2í/sites_avaliable könyvtárban tudod beállítani, alap telepítésnél a defaults fájlban. virtual host esetnén mindegyik domaiinhez van külön fájl, Itt az allowoverride legyen all mindenhol. Feltételezem az Ubuntu ugyanez, mert az debianra épül

  20. Sziasztok! A PHP értelmező kódot a .htaccess fájl legelejére kell tenni? Az utolsó kéd dobozban levő kód sehova sem kell, csak szemléltető, igaz?

    Köszönettel,
    Tamás

  21. a php kódot egy php fileba kell beleírni (.php), az utolsó box tartalmára pedig szükséged lesz, azzal hivatkozol az adatokra. a [] jel közötti számot meg a felette levő box-ban tudod meg hogy micsoda. 1 – fájlnév, 2 – paraméter…

  22. Üdv.

    Segítségre lenne szükségem. A php értelmező kódjában átkell írni valamit vagy nem? És az alatta lévőket hova kell másolnom?
    Némi instrukcióra lenne szükségem.
    Előre is köszi.

  23. Sziasztok kellene nekem ehhez egy kis help.

    htaccess kész a php fájl elejére betettem ezt

    //url kezelés
    $subdir = substr(realpath(dirname(__FILE__)), strlen(realpath($_SERVER[‘DOCUMENT_ROOT’])));
    $tmp_array = explode(‘?’, trim($_SERVER[‘REQUEST_URI’]));
    $uri = str_replace($subdir, ”, $tmp_array[0]);
    $uri = ltrim($uri, ‘/’);
    $URIParts = explode(“/”, $uri);
    $file = $URIParts[1];
    $parameter = $URIParts[2];

    Hogyan lesz ebből szép url?

    Kell még valami kód hozzá, hogy működjön?

  24. Köszönöm a leírást nagyon hasznos kis script.
    Ahogy olvasgattam a hozzászólásokat azt vettem észre, hogy páran ugyanabba a hibába estek amibe én, azaz, hogy nem teljesen értették meg a cikket. :)
    Elsőre én is azt gondoltam, hogy a kód berakása után az URL-jeim szépen fognak megjelenni és nekem nem kell semmit sem csinálni, beírom, hogy index.php?oldal = bejelentkezes és akkor a böngésző automatikusan átiranyít erre index/oldal/bejelentkezes
    A valóságban pedig pont fordítva működik a dolog :D
    Az URL-be ha beírod ezt hogy index/oldal/bejelentkezes akkor a URL php fájl feldolgozza nekünk az url-t és ezek után már azt csinálunk vele ami akarunk olyan php raksz be amilyet csak akarsz. :)

    köszi még egyszer, nagyon hasznos kis leírás volt ;)

  25. Nagyon hasznos leírás tényleg. Egy olyan kérdésem lenne, hogy az hogyan lehetne megoldani, hogy a “szép” ulr-ben ne legyen benne minden. pld:
    ndex.php?oldal = bejelentkezes ez így néz ki index/oldal/bejelentkezes én így szeretném idex/bejelentkezes. Ez megoldható? Előre is köszönöm a segítséget!

  26. Maga a .htaccess még nem eredményezi értelemszerűen a szép url létrejöttét. Így kell programoznod az oldalt. Én azt a megoldást használom, hogy létrehoztam egy index.php-t ami a váza a weboldalnak. És létrehoztam minden egyes oldalhoz egy php scriptet amiben csak ennyi van . Ha az ULR pl. (ateoldalad.hu/szolgaltatas/elsoszolgaltatasom/, akkor a neve a php nek, szolgaltatas.php. Ez a php meghívja az index.php-t. Ennek a body tagjában eldöntöm mi legy a body tartalma, úgy, hogy az index.php tetejére be van includolva a cikkben szereplő php kód. Majd a body részben: pl: if ($_URL[0]==’szolgaltatas’) include(“inc_szolgaltatas.php”); És ebben a php ben kezelem a tartalmat, illetve feldolgozhatom az URL többi paraméterétl, pl: if ($_URL[1]==’elsoszolgaltatas’) {
    és ide jön az első szolgáltatás szövege.
    }
    Régi nem szép url-es forráskódokat természetesen át kell írni.
    Persze ezen kívűl még sokféleképpen meg lehetséges, ez csak egy javaslat.
    ui:
    Azt nem javaslom, hogy az oldal include scriptjét ilyen módon valósítsuk meg (include($_URL[0].’.php’) mert ez feltörhetővé az oldaladat. (onnan tudom, hogy nekem egyszer feltörték, és maga a hekker mesélte el utána, hogy csinálta, és volt olyan rendes, hogy felhítva a figyelmet mit javítsak ki :-))

  27. Köszönöm a választ. Kicsit elírtam a kérdésemet. Azt szeretném, ha a következő index.php?oldal = bejelentkezes így jelenjen meg: index.php/bejelentkezes. Ne így index.php/oldal/bejelentkezes. Ez megoldható lenne?

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét