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: https://www.appserv.org/en/
Tartalomjegyzék
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:
# # 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:
RewriteEngine on Options +FollowSymLinks RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/(.*) $1.php?rewrite=$2 [QSA]
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.
//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:
Array ( [0] => oldalam [1] => filenev [2] => parameter [3] => )
A kódon belül értelemszerűen így kezeljük a tömb elemeinek az értékeit, pl.:
$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.
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.)
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:
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.
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
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
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.
Ü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
beraktam minden kodot az oldalamba (.htaccess, .php) de semmi nem tortent. tudnatok nekem segiteni, miert?
koszonom
http://googlewebmastercentral.blogspot.com/2008/09/dynamic-urls-vs-static-urls.html
Hivatalos álláspont a dinamikus url-ről
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…
…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
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.
Ü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.
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
„../../../images/top_banner.jpg”
Legalábbis azt hiszem, így menni fog.
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
@aty: vágd be ezt a gyökérben található .htaccess-be:
RewriteRule ^(.*)/images/top_banner.jpg$ images/top_banner.jpg [L]
Köszönöm, hasznos volt!
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!!!
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ó.
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.
Linux alá (localhoston) mit csináljak?
Van egy httpd.conf file az /etc/apache2-ben, de tök üres.
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
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
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…
Ü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.
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.
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?
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 ;)
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!
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 :-))
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?
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.