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.

Kapcsolódó bejegyzések:
  • Gondolom nem vagyok egyedül, amikor azt mondom, hogy lassan kezdenek unalmassá válni a .php, .html, .asp és ehhez hasonló kiterjesztések az url-ek végén. Pár per …

  • A Gzip tömörítés (Gzip compression) igencsak felgyorsíthatja a lapodat letöltődési sebességét. Azt ugye talán mondani sem kell, hogy a lapok betöltődési ideje, …

  • Ha FTP szerver/tárhely esetében belefutsz abba a hibába, hogy egy könyvtárat nem lehet törölni, jó eséllyel az lesz az oka, hogy a könyvtárban van egy “.htaccess …

  • Jöjjön most egy másik honlapgyorsítási lehetőség, az “expires”. Szintén a .htaccess-be kell beletenni és azt a célt szolgálja, hogy bizonyos fájltípusokat ne aka …

  • A .htaccess alapú átirányításról már régebben is volt szó itt a lapon, de nem lett teljesen kifejtve, hogy milyen lehetőségek is rejlenek e téren. Egy tegnapi be …

A cikket beküldte: d3xter20 (http://)

33 hozzászólás

  1. ADM says:

    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. d3xter20 says:

    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. d3xter20 says:

    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. Harder says:

    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. Luos says:

    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. d3xter20 says:

    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. Doenroy says:

    Ü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. szmegma says:

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

  9. tta says:

    http://googlewebmastercentral.blogspot.com/2008/09/dynamic-urls-vs-static-urls.html
    Hivatalos álláspont a dinamikus url-ről

  10. Atis says:

    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…

  11. Atis says:

    …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

  12. Harder says:

    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.

  13. d0cz1 says:

    Ü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.

  14. aty says:

    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

  15. MacGyver says:

    “../../../images/top_banner.jpg”
    Legalábbis azt hiszem, így menni fog.

  16. zebster says:

    bocsánat, úgy látom hogy a kacsacsőrős tag-eket itt nem megengedettek:) szóval: http://www.w3schools.com/TAGS/tag_base.asp

  17. Squito says:

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

    1
    
    RewriteRule ^(.*)/images/top_banner.jpg$ images/top_banner.jpg [L]
  18. Doty says:

    Köszönöm, hasznos volt!

  19. HunProBalazs says:

    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!!!

  20. én says:

    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ó.

  21. pinter.istvan says:

    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.

  22. Ubuntus says:

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

  23. Attila says:

    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

  24. Tamás says:

    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

  25. crash says:

    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…

  26. Gabe says:

    Ü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.

  27. Szia!
    Érdekel a téma, de még nincs elég ismeretem.A kérdésem az lenne, hogy hogyan tudnám pl. ezt az URL-t: http://www.bulicentrum.hu/index.php?page=1&submenu=1&active=Aut%F3b%E9rl%E9s ilyenné varázsolni: http://www.bulicentrum.hu/Autóbérlés- A másik kérdésem, hogy a jelenlegi url-ben normálisan jelenjenek meg a karakterek van erre valami mód pl. php-ban?
    Köszönöm előre is.

  28. King says:

    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?

  29. bergkamp says:

    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 ;)

  30. kissp says:

    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!

  31. Aty says:

    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 :-))

  32. kissp says:

    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?

  33. Gabesz says:

    Hali!

    nem igazán értem a .htaccess müködését. Jelen esetben a Rewrite érdekelne.
    Ami nem megy, hogy a php-t szedje ki.
    Egy micro siteról van szó.
    pl.: http://localhost/samlikeszito/rolam.php
    helyett
    http://localhost/samlikeszito/rolam
    legyen.
    Mivel nem GET -el adok át paramétert hanem mindig másik php-t hívok meg.
    munkaim.php, kapcsolat.php, stb…

    köszönöm a segítséget.

Szólj hozzá
a Keresőbarát, szép url-ek c. bejegyzéshez

- Engedélyezett HTML elemek: <a> <em> <strong> <ul> <ol> <li>
- Forráskód beküldéséhez tedd a kódot ezek közé: <pre lang="php" line="1">Kódrészlet helye itt</pre>