Rövid webcímek készítése és kezelése
Manapság egyre ritkábbak az olyan oldalak, melyeket nem dinamikusan állítanának elő készítőik. Sokak számára jelentősen kényelmesebb valamilyen feladat-specifikus szerkesztővel elkészíteni az oldal tartalmait - mely lehetővé teszi a kategorizálást, meta információk megadását -, mint egy általános weboldal-szerkesztő programot elővenni a cél érdekében. Ez azonban ahhoz a sajnálatos következményhez vezetett, hogy a webcímek kórosan elburjánzottak, nagyon hosszúak és "csúnyák" lettek. Lássuk miért nem jó ez nekünk, és mit tehetünk ellene! Főleg Apache szerveren működő megoldásokat fogunk vizsgálni.
Lássuk mit mond az első webím: tölts be egy modult, amelynek a neve 'News', abban vedd elő azt az írást, melynek sorszáma 595, és a hozzászólásokat szálakkal jelenítsd meg, a régebbieket felül kiírva nullás megjelenítési küszöbbel. Két részre bonthatjuk az adott webcímet: a hír megjelenítésére vonatkozó részre és a hozzászólások preferenciáit tartalmazó részre. Ezutóbbi felhasználótól függő érték, illetve nem belépett tag esetén a webhely alapértelmezése. Tehát nincs semmiféle értelme a webcímben tartani, hiszen programozottan mindig előkereshető.
Az első rész a modul betöltésére vonatkozik, és vizsgálatunk szempontjából sokkal érdekesebb kérdéseket vet fel. Elsősorban a modul funkciói vizsgálatával lehet megállapítani, hogy a
Összehasonlításképpen elmondhatjuk, hogy a mostani webcím sokkal kifejezőbb: magyar nyelvű; jelzi, hogy hírről van szó; benne van a dátum, és még a tartalomra utaló kis részlet is. Sokkal rövidebb és letisztultabb, ráadául nem utal benne semmi arra, hogy dinamikus oldalról lenne szó. A hírek esetében minden egyes tartalomhoz saját rövid címet rendelünk, ám ez nem feltétlenül szükséges. A dinamikus oldalak rövid és barátságos címeinek előállításának vannak automatikus módjai is. Ám mielőtt megnéznénk, milyen eszközeink vannak erre, lássuk miért is érdemes egyáltalán belefogni.
Ezen webcím lekérésekor a szerver felismeri, hogy nem található a teljes címhez illeszthető állomány, ezért visszalép aTermészetesen nem csak egy információ morzsát adhatunk így át, az "alkönyvtárak" száma tetszőleges lehet. Ennek ellenére ennek a módszernek két kézenfekvő hátránya is van. Az egyik, hogy minden lehetséges tartalom típushoz el kell helyeznünk egy PHP állományt, a másik pedig az, hogy továbbra is látszik, hogy PHP-vel operálunk, csak a webcímet sikerült rövidíteni. Először is lássunk egy megoldást a második problémára.Ahhoz, hogy ezt használhassuk, a
Innentől kezd érdekes lenni az, hogy a keresőrobotok visszafogják a dinamikus oldalak indexelését, hiszen statikusnak látszó oldalunkkal kapcsolatban ilyen fenntartásaik már nem lesznek. Ezért hatékony gyorsítótárazást és/vagy más módszereket kell alkalmazni annak érdekében, hogy ne omoljon össze szerverünk egy-egy Google vagy MSNBot támadás során.
Mint említettem ez a módszer ugyan megoldotta a dinamikusság látszatának elfedését, de ugyanakkor nem növelte eléggé a belső rugalmasságot a webcímek kezelhetőségét illetően. Még két módszer van a tarsolyunkban, melyek az első kettőnél sokkal rugalmasabbak, és végre elfelejthetjük azt a megkötést, hogy minden "alkönyvtárnak" egy-egy PHP szkriptet kell megfeleltetni.Ez a beállítás azt eredményezi, hogy minden "nem található oldal" (azaz 404-es) hiba esetén a webhelyünk gyökerében lévő
Ezzel az eszközzel felvértezve a szerverünkön például aA kapott webcímet először megszabadítjuk a kezdő perjeltől, majd feldaraboljuk, hogy az első komponenst megkapva ki tudjuk választani a megfelelő modult, mely lekezeli a kérést. Természetesen lehet egy előre megadott címkezelő függvény hozzárendelési táblát is használni, vagy bármilyen bonyolultabb megoldást választani. Nagyon fontos azonban arra figyelni, hogy most egy 404-es hibát kezelünk, és ha sikerül megtalálnunk a jó oldalt, akkor a válasszal megadott állapotot is meg kell változtatni, tehát ha azonosítható és betölthető tartalmat kértek, akkor a HTTP állapot fejlécet
Kipróbálhatjuk a
Ezen módszer előnye, hogy - az előbbiekkel ellentétben - tetszőleges címformák kezelésére jó, nem igényel egy-egy PHP állományt minden "könyvtár" bevezetéséhez. Ezen kívül eléggé egyszerűen beállítható, és az Apache jellemző telepítésén nyugodtan használható (amennyiben nem tiltották le számunkra). Hátrányaként felhozható, hogy a 404-es hibák mindig egy újabb bejegyzést jelentenek majd az Apache hibanaplójában alapbeállítások mellett, ezért felesleges hibaáradattal tölthetjük el a hibanaplót.
Első megközelítésben megoldásunk nem fog többet nyújtani, mint a fentiElőször is nem biztos, hogy be van kapcsolva a szerveren a Rewrite modul támogatása, ezért egy ilyen feltételes részbe burkoljuk az utasításainkat. Ha nem így tennénk, akkor kikapcsolt Rewrite modul esetén 500-as hibát kapnánk a könyvtár minden állományára és az alkönyvtárakra is, ami nem túl kellemes élmény.
Minden Rewrite modulhoz kapcsolódó direktíva a Rewrite kulcsszóval kezdődik, és általában valamilyen mintaillesztő kifejezés vagy más feltétel segítségével teszi lehetővé a webcím átalakítás megvalósítását.
Megjegyzendő, hogy nem csak egy átírást fogalmazhatunk meg. Valójában több átírási blokkot alkalmazhatunk, melyek a saját blokkjukban megadott feltételek szerint hajtódnak végre. Ráadásul több Rewrite direktíva is rendelkezésre áll, melyeket most nem ismertetnék. További információért érdemes megnézni a modul dokumentációját.
A Rewrite modul által kezelt bejövő kérések különleges kezelésével nem is kell törődnünk, hiszen az általunk megadott PHP állományban fognak kikötni. Természetesen külön irányításokat készíthetünk a
A rövid webcímek technikáinak megismerése kapcsán sokakban felmerülhet, hogy saját webhelyüket is ilyen kialakításúra szeretnék változtatni. Egy ilyen vágy megszületését némi előkészítésnek kell követnie. Először is meg kell állapítani, hogy milyen ráhatás lehetséges a webhelyet működtető motorra. Ha saját készítésű szkriptekről van szó, akkor a változtatást "könnyű" keresztülvinni, hiszen a webcímek kezelésének módját kell csak átalakítani.
Ha azonban egy kész alkalmazást használunk (mint például a cikk elején emlegetett PostNuke), akkor a váltás sokkal nagyobb dió. A PostNuke például minden zsigerében hosszú és paramétergazdag webcímek generálására van felkészítve, és erről nagyon nehéz lebeszélni. A Mountain Research and Development publikálta a PostNuke rövid webcímekkel kapcsolatos ismertetőjét. Itt fogadási oldalon az említett Rewrite szabályok széles garmadáját használják fel. Lássunk két példát:A webcím átírás itt már jóval túlmutat a 404-es hibakezelés megoldásain, hiszen a lekért címek bizonyos tulajdonságai alapján más-más paraméterezést állít elő. Egyáltalán nem lehetetlen persze a 404-es hibakezelést alkalmazni, és PHP-n belül elvégezni a webcímek áltakítását, de mivel végül mindenképpen a mintaillesztő kifejezésekhez kell nyúlni, ezért csak az URL Rewrite szintaktikájának megismerésétől tudjuk magunkat megóvni.
Ami a kiírást illeti, a megfelelő webcímek kimenetre kerülését egy kimeneti buffereléses megoldással valósították meg, azaz a PostNuke által generált teljes oldalt a memóriában tartják, majd kiküldés előtt egy PHP-ben megvalósított hosszú webcím -> rövid webcím konverziót követnek el. Hasonló megközelítés bármilyen rendszer esetén alkalmazható, és bár a webcím problémát megoldja, hatékonynak nem nevezhető.
Annak érdekében, hogy a váltás után a webcímek átírása a keresők adatbázisában automatikus legyen, egy dologra mindenképpen oda kell figyelni. A régi webcímek esetében nem szabad önműködő belső átirányításokat végezni, hiszen akkor a régi webcímek továbbra is működnek, és a keresők folytatják a hosszú webcímes találatok szolgáltatását. Ehelyett HTTP átirányítást kell eszközölni, mégpedig aEz természetesen csak egy kis megvalósítási példa, mindig az adott körülmények között alkalmazott webcím sémákat kell figyelembe venni. Felmerülhet az, hogy a
■ A szépség és a szörnyeteg
Szerencsére még megmaradt néhány archív link egyik elődünkről, a korábbi PHPInfo oldalról, amely PostNuke rendszerrel publikálta olvasói számára a tartalmakat. Íme egy hír linkje a korábbi oldalon, összehasonlítva ugyanannak a hírnek a mostani webcímével:http://phpinfo.wish.hu/modules.php?op=modload&name=News&file=article&sid=595&mode=thread&order=0&thold=0
http://weblabor.hu/hirek/20030717/hircikkbekuldo
http://weblabor.hu/hirek/20030717/hircikkbekuldo
Lássuk mit mond az első webím: tölts be egy modult, amelynek a neve 'News', abban vedd elő azt az írást, melynek sorszáma 595, és a hozzászólásokat szálakkal jelenítsd meg, a régebbieket felül kiírva nullás megjelenítési küszöbbel. Két részre bonthatjuk az adott webcímet: a hír megjelenítésére vonatkozó részre és a hozzászólások preferenciáit tartalmazó részre. Ezutóbbi felhasználótól függő érték, illetve nem belépett tag esetén a webhely alapértelmezése. Tehát nincs semmiféle értelme a webcímben tartani, hiszen programozottan mindig előkereshető.
Az első rész a modul betöltésére vonatkozik, és vizsgálatunk szempontjából sokkal érdekesebb kérdéseket vet fel. Elsősorban a modul funkciói vizsgálatával lehet megállapítani, hogy a
file=article
részre szükség van-e. A News modul két állománnyal operál: az index
egy hír listát jelenít meg, az article
pedig egy konkrét hírt, tehát ez elfogadható paraméter. A modules.php
állomány egyetlen használható op
paramétere a modload
, tehát bármi mással próbálnánk meghívni, nem adna értelmes választ. Röviden tehát a name
, a file
és a sid
paraméterek létjogosultsága indokolható meg egyáltalán.Összehasonlításképpen elmondhatjuk, hogy a mostani webcím sokkal kifejezőbb: magyar nyelvű; jelzi, hogy hírről van szó; benne van a dátum, és még a tartalomra utaló kis részlet is. Sokkal rövidebb és letisztultabb, ráadául nem utal benne semmi arra, hogy dinamikus oldalról lenne szó. A hírek esetében minden egyes tartalomhoz saját rövid címet rendelünk, ám ez nem feltétlenül szükséges. A dinamikus oldalak rövid és barátságos címeinek előállításának vannak automatikus módjai is. Ám mielőtt megnéznénk, milyen eszközeink vannak erre, lássuk miért is érdemes egyáltalán belefogni.
Nem csak kereső optimalizálás
A rövid webcímek használata számos pozitív hatást gyakorolhat webes jelenlétünkre. Nézzük sorban, hogy milyen előnyökkel járhat.- Kereső indexelés: Ami ezt illeti, többnyire sajnos csak mendemondákból tudunk ítélni. A Google webmestereknek szóló dokumentációja mindenesetre tartalmazza, hogy a dinamikus oldalak indexelését visszafogottan végzik, nehogy összeomlasszák a mögöttük futó programokat a kérésáradattal. A közhiedelem szerint a webcímekben megjelenő minden újabb dinamikusságra utaló karakter (?, &) az indexelés esélyének csökkenését jelenti, azaz például minél több paramétert adunk át a PHP szkriptünknek GET értékként, annál inkább dinamikusnak tűnik a kereső indexelője számára oldalunk. Ez meglehetősen logikus feltevés.
- Megjegyezhető címek: A rövid címek könnyen megjegyezhetőek, és sokkal több helyre kihelyezhetőek. Ha a fent leírtak szerinti hírek index oldal címet képezzük a PostNuke módján, az sokkal barátságtalanabb lesz, mint ha egyszerűen azt mondanánk, hogy webhelyünk
hirek
mappájában vannak a hírek. Egy ilyen rövid webcím könnyen elfér névjegykártyán, hirdetésekben, akár rádióban bemondva is. Nem utolsó sorban szívesebben továbbítják értünk lelkesedő látogatóink emailben, hiszen nem kell tartani attól, hogy a webcím kettétörik a sortörésben. Egyes vélemények szerint ugyanez a pszhicológiai ok húzódik meg amögött is, hogy szívesebben linkelnek a rövid címekre. Valószínűleg ebben az is benne van, hogy általában profibbnak gondolják azt, aki ezt a technikát alkalmazza. A több ránk mutató link pedig rendkívül hasznos kereső optimalizálási szempontból, hiszen így találati oldalakon előrébb szerepelhetünk.
- Méret optimalizálás: Tartalommal zsúfolt oldalakon (vagy legalábbis sok linket biztosító honlapokon) a hosszú webcímek kiírása jelentősen megnöveli az oldal méretét, mely a kiszolgálására és megjelenítésére fordított időt is növeli. Ha rövidebb webcímeket használunk, oldalunkon belüli kapcsolataink is kisebb HTML lapot eredményeznek. Ezt a törekvést kicsit visszavetheti, ha nagyon hosszú webhelyünk alapcíme (egy szolgáltatónál valamely eldugott alkönyvtárban van például). Ez sem okozhat problémát, hiszen a
<base>
HTML fejléc elemmel saját alapcímet határozhatunk meg a linkek számára. A méret optimalizálás egyik zászlóshajója a Yahoo! honlapja, ahol a következő formájú linkeket találunk:Itt a rengeteg link kiírása mellett csak ilyen rövid HTML kóddal tudták megoldani, hogy ne legyen túl nagy a HTML kimenet (sajnos az idézőjeleket is lespórolva). A base elem használatára is kiváló példát mutatnak, ebben adják át a munkamenet azonosítót. A méret csökkenés különben a kereső optimalizálásban is segít, a sallangokat kisebb mértékben, a tartalmat nagyobb súlyban hordozó oldalakat a keresők jobban szeretik (megint csak állítólagosan).<a href=r/sh>Shopping</a>
- Könnyebb programozás: Ha rövid webcímeket szeretnénk használni, akkor jól át kell gondolnunk, hogy mit hova teszünk, annak érdekében, hogy a címek tartósan használhatóak legyenek. Ez rákényszerít minket arra, hogy átgondoljuk tartalmunkat, és egységes kialakítást hozzunk létre. Ezt követően azonban a rövid címekkel könnyebb lesz a dolgunk, hiszen kezelésük programunkban is egyszerű. A Weblabornál például a webcímek alapján döntjük el, hogy melyik fület kell a felső navigációban megjeleníteni. Ha egy webcím elején
hirek
szerepel, akkor a hírekhez tartozó fület nyitjuk le.
- És még több előny a keresőknél: Ha még nem lett volna elég kereső optimalizálásból, meg kell említeni, hogy például a Google a webcímekben lévő kulcsszavakat is indexeli. Tehát ha olyan címet alakítunk ki, mint
http://pelda.hu/kutya/eledel.html
akkor ez az oldal már a címe miatt is jó eséllyel bukkan fel akutya eledel
keresésre. A tapasztalatok szerint a kötőjellel elválasztott szavak külön szónak számítanak az indexelésben.
Kés, villa, olló
Most, hogy már tudjuk, hogy van élet a borzalmasan kialakított webcímeken túl, ráadásul ez napossabbá teszi fejlesztéssel töltött óráinkat, és még a közben fogyasztott kávét is megízesíti, lássuk, miként léphetünk be a rövid webcímekkel dolgozók táborába.1: PATH_INFO
Ez a módszer eléggé könnyen megvalósítható olyan szervereken is, ahol különben nem tudjuk befolyásolni a beállításokat. A webszerverek azon tulajdonságán múlik, hogy amennyiben nem találnak meg egy webcímhez tartozó dokumentumot, akkor a perjelek mentén visszafelé lépdelve megnézik, hogy az előtagok valamelyike nem található-e meg a kiszolgálón. Lássunk egy ilyen címet:http://pelda.hu/konyvek.php/12
Ezen webcím lekérésekor a szerver felismeri, hogy nem található a teljes címhez illeszthető állomány, ezért visszalép a
konyvek.php
-re, amit meg is talál. A PHP állományban elérhető a $_SERVER['PATH_INFO']
értékben a PHP szkript neve után található információ. Ezzel aztán bármit kezdhetünk, ha konkrétan könyv sorszámot vártunk, akkor valami ehhez hasonlót javasolnék:
<?php
// Ha kaptunk sorszamot, akkor azt vesszuk le egesz szamma alakitva, kulonben 0 az alapertelmezes
$sorszam = (isset($_SERVER['PATH_INFO']) ? intval(substr($_SERVER['PATH_INFO'], 1)) : 0);
if ($sorszam) {
// Valamilyen kod, ami eloveszi az adott konyvet
}
else {
// Valamilyen kod, ami hibat ad, vagy
// egy konyv index oldalt ir ki
}
2: PATH_INFO + ForceType
Ha Apache szervert használunk, nem kell feltétlenül PHP kiterjesztést adnunk szkriptünknek ahhoz, hogy azt a PHP feldolgozza. Valójában bármilyen állományt PHP típusúvá kényszeríthetünk. A következőt kell elhelyeznünk webhelyünk gyökérkönyvtárában egy.htaccess
állományban (vagy bármilyen más módon az Apache tudtára kell adnunk):
<Files "konyvek">
ForceType application/x-httpd-php
</Files>
FileInfo
engedélyt tartalmaznia kell az adott könyvtárra érvényes AllowOverride
beállításnak. Ha tehát a fenti kód hatással van a könyvtárban lévő állományokra, akkor a konyvek.php
-t átnevezhetjük konyvek
-re, és a továbbiakban használhatjuk az első metódust a PATH_INFO
kezelésére. Webcímeink továbbra is közvetlenül tartalmazni fogják a PHP állomány nevét, ez azonban csak a webszerver számára lesz ismert tény. Ezzel a módszerrel létrehozhatunk további hirek
, cegunkrol
és hasonló nevű állományokat, melyek ilyen nevű "könyvtárakként" jelennek meg majd a látogatók számára.Innentől kezd érdekes lenni az, hogy a keresőrobotok visszafogják a dinamikus oldalak indexelését, hiszen statikusnak látszó oldalunkkal kapcsolatban ilyen fenntartásaik már nem lesznek. Ezért hatékony gyorsítótárazást és/vagy más módszereket kell alkalmazni annak érdekében, hogy ne omoljon össze szerverünk egy-egy Google vagy MSNBot támadás során.
Mint említettem ez a módszer ugyan megoldotta a dinamikusság látszatának elfedését, de ugyanakkor nem növelte eléggé a belső rugalmasságot a webcímek kezelhetőségét illetően. Még két módszer van a tarsolyunkban, melyek az első kettőnél sokkal rugalmasabbak, és végre elfelejthetjük azt a megkötést, hogy minden "alkönyvtárnak" egy-egy PHP szkriptet kell megfeleltetni.
3: ErrorDocument
Kulcsszavunk ezúttal azErrorDocument
, azaz a hibák kezelésére szolgáló dokumentum beállításának lehetősége. Amennyiben az Apache egy nem létező webcímet kap, és a fent említett visszalépéssel sem tud értelmes előtagot találni benne, akkor elindítja hibakezelő mechanizmusát. Ennek a folyamatnak a helyére könnyen delegálni tudjuk saját szkriptünket, mely magára vállalja a nem található oldalak kezelését. Ismét egy .htaccess
állományt kell létrehozni, most a következő tartalommal:
ErrorDocument 404 /cimkezelo.php
cimkezelo.php
fog lefutni. Ahhoz, hogy ennek a .htaccess
állománynak hatása legyen, ismét csak az előbbi módszernél említett jogosultságnak kell érvényesnek lennie mappánkra.Ezzel az eszközzel felvértezve a szerverünkön például a
/termek/54
cím meghívására a webszerver meg fogja állapítani, hogy ilyen állomány nem létezik, ezért a cimkezelo.php
szkriptnek adja át a vezérlést egy átirányított HTTP lekérdezést indítva. A következőképpen tudjuk lekezelni a kérést:
<?php
// Kapjuk el azt az cimet, amit kertek es az alapjan dontsuk el, mit toltunk be
$URI = (isset($_SERVER['REQUEST_URI']) ? substr($_SERVER['REQUEST_URI'], 1) : '');
$URIparts = explode("/", $URI);
switch ($URIparts[0]) {
case 'hirek':
status200();
// Hirek modul betoltese es lekezeles
break;
case 'termek':
status200();
// Termekeket kezelo modul betoltese es lekezeles
break;
default:
// Nem azonosithato cim tipust kertek
break;
}
function status200()
{
// Mukodjon PHP 4.3.0 elotti verzioval is
@header("HTTP/1.1 200 OK");
@header("Status: 200 OK", TRUE, 200);
}
200 OK
státuszra kell állítani. Ha nem megfelelő címet kértek, akkor maradhat a 404-es állapot.Kipróbálhatjuk a
$_SERVER
tömb tartalmának kiírását. Látni fogjuk, hogy számos REDIRECT_
kezdetű érték jelenik meg, melyek lehetőséget adnak arra, hogy megtudjuk például, hogy milyen hibakód kezelése érdekében hívta meg a szkriptet a szerver, illetve a REDIRECT_URL
-ben is megkaphatjuk az átirányítás előtti címet.Ezen módszer előnye, hogy - az előbbiekkel ellentétben - tetszőleges címformák kezelésére jó, nem igényel egy-egy PHP állományt minden "könyvtár" bevezetéséhez. Ezen kívül eléggé egyszerűen beállítható, és az Apache jellemző telepítésén nyugodtan használható (amennyiben nem tiltották le számunkra). Hátrányaként felhozható, hogy a 404-es hibák mindig egy újabb bejegyzést jelentenek majd az Apache hibanaplójában alapbeállítások mellett, ezért felesleges hibaáradattal tölthetjük el a hibanaplót.
4: URL Rewrite
Az Apache URL Rewrite (vagy IIS szerverekhez az ISAPI Rewrite) lehetővé teszi, hogy az Apache kérések kiszolgálásába ágyazott mintaillesztő kifejezéseket írjunk, melyek a folyamat elején megváltoztathatják a szerver által kezelt webcímet. Ezzel elérhetjük, hogy az előző módszer átirányított lekérdezése helyett rögtön az adott lekérdezésben kezeljük le az igényelt címet, csupán azt kell tudnunk, hogy miként tudjuk a webcím átírásokat megvalósítani.Első megközelítésben megoldásunk nem fog többet nyújtani, mint a fenti
ErrorDocument
alapú változat, csak éppen másképp oldjuk meg ugyanazt a feladatot. A kezünkben lévő rugalmasság csak később tárul fel. Ismét egy .htaccess
állományt fogunk létrehozni a következő tartalommal. A példa a Drupal forráskódjából származik.
<IfModule mod_rewrite.c>
RewriteEngine on
# Ebben az alkonyvtarban vagyunk, ezt
# figyelembe kell venni az atirasoknal
#RewriteBase /cegunkwebhelye
# Minden nemletezo oldal webcimet iranyitsuk at az index.php-re
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [QSA]
</IfModule>
Minden Rewrite modulhoz kapcsolódó direktíva a Rewrite kulcsszóval kezdődik, és általában valamilyen mintaillesztő kifejezés vagy más feltétel segítségével teszi lehetővé a webcím átalakítás megvalósítását.
- A
RewriteBase
azt adja meg, hogy milyen alapkönyvtárat kell figyelembe venni. Ezt akkor használjuk, ha a webhelyünk valamilyen alkönyvtárban van, mert akkor a további feltételekbe ezt az alkönyvtárat már nem kell belekódolni, és egyszerűbb lesz a könyvtárváltás, ha később szükségessé válik.
- A
RewriteCond
olyan feltételeket ad meg, melyek teljesülése a soron következőRewriteRule
végrehajtásához feltétlenül szükséges. Itt az adott lekéréshez kapcsolódó változókat is használhatjuk. A példában használt első feltétel ellenőrzi, hogy a kért webcím nem egy állomány, a második feltétel pedig akkor teljesül, ha nem létező könyvtár nevét kérték. Tehát ha nem létező állományt, és nem is létező könyvtárt kértek, akkor hajtódik végre az átírási szabály.
- A
RewriteRule
szabja meg azt, hogy az előzetesen megadott feltételeknek megfelelő webcímet végülis miként kell átírni. Itt mintaillesztő kifejezés segítségével azt adjuk meg, hogy a teljes webcímet azindex.php
q
nevű paraméterébe tegyük át. A szögletes zárójelben a webcím átírás egyéb beállításai találhatóak. AQSA
azt kéri, hogy egy esetleges GET lekérdezési paraméter listát a megadott lista végére fűzze fel az Apache. Két példa a webcím átírás eredményeire:
/hirek/14 => /index.php?q=hirek/14
/hirek?oldal=2 => /index.php?q=hirek&oldal=2
Megjegyzendő, hogy nem csak egy átírást fogalmazhatunk meg. Valójában több átírási blokkot alkalmazhatunk, melyek a saját blokkjukban megadott feltételek szerint hajtódnak végre. Ráadásul több Rewrite direktíva is rendelkezésre áll, melyeket most nem ismertetnék. További információért érdemes megnézni a modul dokumentációját.
A Rewrite modul által kezelt bejövő kérések különleges kezelésével nem is kell törődnünk, hiszen az általunk megadott PHP állományban fognak kikötni. Természetesen külön irányításokat készíthetünk a
hirek
kezdetű webcímekre, hogy az a hírek modulnak megfelelő hirek.php
-re irányítson, és a dolgot tovább bonyolíthatjuk, de végső soron a PHP szkriptjeinkhez egy hagyományos HTTP lekérdezés fog eljutni, és a GET/POST változókat minden gond nélkül tudjuk kezelni. Emiatt ez a megoldás eléggé jól használható kész alkalmazások "előtétjeként" is. A Rewrite megoldás másik előnye, hogy kevesebb erőforrást foglal, mert a kérést magát módosítja feldolgozás közben, és nem egy átirányított lekérdezést indít. Mindezekkel az előnyökkel persze csak akkor élhetünk, ha jó mintaillesztési ismereteink vannak és a Rewrite modul az adott kiszolgálón rendelkezésre áll.Dobj vissza kenyérrel
Megismerve a rövid webcímek kezelésének technikáit, felmerül a kérdés, hogy mégis miként tudjuk ezekre irányítani a felhasználókat. Alkalmazásunkat fel kell készíteni arra, hogy rövid webcímeket írjon ki a választott technológiának megfelelően. Az, hogy belsőleg 404-es hibára képezzük le a címet vagy Rewrite modult használunk, csak a kérés kiszolgálása szempontjából érdekes, a felhasználó nem fogja észrevenni a különbséget, ha minden esetben a szép rövid webcímeket írjuk ki. A teljes alkalmazásnak késznek kell lennie arra, hogy ha egy webcímet kiírunk, akkor az a megfelelő formában jelenjen meg.A rövid webcímek technikáinak megismerése kapcsán sokakban felmerülhet, hogy saját webhelyüket is ilyen kialakításúra szeretnék változtatni. Egy ilyen vágy megszületését némi előkészítésnek kell követnie. Először is meg kell állapítani, hogy milyen ráhatás lehetséges a webhelyet működtető motorra. Ha saját készítésű szkriptekről van szó, akkor a változtatást "könnyű" keresztülvinni, hiszen a webcímek kezelésének módját kell csak átalakítani.
Ha azonban egy kész alkalmazást használunk (mint például a cikk elején emlegetett PostNuke), akkor a váltás sokkal nagyobb dió. A PostNuke például minden zsigerében hosszú és paramétergazdag webcímek generálására van felkészítve, és erről nagyon nehéz lebeszélni. A Mountain Research and Development publikálta a PostNuke rövid webcímekkel kapcsolatos ismertetőjét. Itt fogadási oldalon az említett Rewrite szabályok széles garmadáját használják fel. Lássunk két példát:
# News-main.html es hasonlok iranyitasa a modules.php-re
RewriteRule ^([^\+]+)\+main.html$ modules.php?op=modload&name=$1&file=index [L]
# Teljes cikk olvasasa alapertelmezett parameterekkel
RewriteRule ^displayarticle([0-9]+).html$ modules.php?op=modload&name=News&file=article&sid=$1&mode=thread&order=0&thold=0 [L]
Ami a kiírást illeti, a megfelelő webcímek kimenetre kerülését egy kimeneti buffereléses megoldással valósították meg, azaz a PostNuke által generált teljes oldalt a memóriában tartják, majd kiküldés előtt egy PHP-ben megvalósított hosszú webcím -> rövid webcím konverziót követnek el. Hasonló megközelítés bármilyen rendszer esetén alkalmazható, és bár a webcím problémát megoldja, hatékonynak nem nevezhető.
Az üveghegyen is túl
Az is előfordulhat, hogy nem meglévő rendszerünk köré akarunk gyógyító kódokat építeni, hanem teljes váltást szeretnénk megvalósítani jelenlegi rendszerünkről valami új (legalábbis rövid webcímeket támogató) megoldásra. Ezesetben különösen érdemes figyelnünk arra, hogy korábbi webcímeink továbbra is elvezessék a látogatókat a célhoz, és hogy HTTP átirányítással tegyék mindezt. Nem elhanyagolható szempont, hogy váltásunk után a keresőrobotok első látogatása során oldalaink törlődni fognak az indexekből, ha 404-es válaszokat adunk lekéréseikre. Ezért régebbi címeinket úgy kell kezelnünk, hogy azok a tartalmak új oldalaira irányítsanak át. Ha a cikk elején említett korábbi PostNuke címet kipróbálod, látni fogod, hogy az egyenesen az új címre irányít. Így a ránk linkelő oldalak és a keresőrobotok is megtudják, hogy mi lett a tartalom új címe és ezt teszik a korábbi webcím helyére.Annak érdekében, hogy a váltás után a webcímek átírása a keresők adatbázisában automatikus legyen, egy dologra mindenképpen oda kell figyelni. A régi webcímek esetében nem szabad önműködő belső átirányításokat végezni, hiszen akkor a régi webcímek továbbra is működnek, és a keresők folytatják a hosszú webcímes találatok szolgáltatását. Ehelyett HTTP átirányítást kell eszközölni, mégpedig a
301 Moved Permanently
állapotkóddal, mely alapján a keresőrobot meg fogja érteni, hogy a korábbi tartalom átmozgatott megfelelőjének címét adjuk át, melyet az adott tartalom új címeként kell kezelni. Lássunk erre egy példát a 404-es kezelő módosításával:
<?php
// Kapjuk el azt az cimet, amit kertek es az alapjan dontsuk el, mit toltunk be
$URI = (isset($_SERVER['REQUEST_URI']) ? substr($_SERVER['REQUEST_URI'], 1) : '');
$URIparts = explode("/", $URI);
switch ($URIparts[0]) {
case 'hirek':
http_status(200);
// Hirek modul betoltese es lekezeles
break;
case 'termek':
http_status(200);
// Termekeket kezelo modul betoltese es lekezeles
break;
default:
// Korabbi hirek lekezelese
if (preg_match("!^modules.php\\?op=modload&name=News&file=article&sid=(\\d+)!", $URI, $match)) {
header("Location: /hirek/$match[1]");
http_status(301);
exit();
}
// Valamilyen mas nem jo cimet kertek, azt is le kell kezelni
break;
}
function http_status($code = 200)
{
// Allapotnevek
$string = array(
'200' => 'OK',
'301' => 'Moved Permanently'
);
$status = $string[$code];
// Mukodjon PHP 4.3.0 elotti verzioval is
@header("HTTP/1.1 $code $status");
@header("Status: $code $status", TRUE, $code);
}
modules.php
paraméter sorrendje túlságosan is kötött a kódban. Ez tapasztalatok szerint nem jelent problémát, hiszen a PostNuke szinte mindig ezt a paraméter sorrendet adja ki.
valami => valami.php
valami.php
-ravalami
-ként hivatkozzunk, tehát a szerver automatikusan hozzáadja a.php
-t, így nem szükségesvalami
nevű fájl és a ForceType.Ha értenék hozzá, akkor leírnám a modul nevét is, de... :)
MultiViews
Zsír
Melyik melyik?
Egy s más az apache tréfáiról
2. Apache2 alatt életünk az AcceptPathInfo direktíva szinesíti, amiről ha nem tudunk, akkor kitépjünk a hajunkat, hogy miért nem megy a kedvenc PHP scriptünk, ami Apache1 alatt pöpecül ment...
3. A RewriteRule jobb oldalán néha kell / jel az egész mindenség elé. Néha megél anélkül is. Például a Drupal-ban eredetileg ugyebár nincsen, mint azt a fentiekben láttuk. Ám mint a Drupal.org-on is jeleztem, azért néha nem árt, aztán a yuit nevű user is jelezte ugyanezt. Tehát, ha valaki végtelen redirect ciklust lát a rewrite log-ban, akkor térjen át abszolút pathra a rewrite rule-ban. (1.3.28 és felette van rewrite szám korlátozás. De a Debian Woody-ban az Apache az ugye 26-os, amíg meg nem unjuk és le nem cseréljük a dotdeb.org-ról.)
Még egy lehetőség...
Ezenkívűl lehet ilyet is csinalni, a ForceType helyett:
AddType application/x-httpd-php .php .html
Ekkor ugye a html állományokat is php-ként kezeli.
Egyébként azt hallottam, hogy nagy leterhelésnél nem jó mod_rewrite-ot használni.
Inkább
-boogie-
-f valóban
Paraméterezés
301 vs. 302
A szövegben 301, a kódban 302 szerepel. Miért?
301
További infó: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
-boogie-
Kiegeszites!!
Leirom okulasul:
RewriteEngine on
# Ebben az alkonyvtarban vagyunk, ezt
# figyelembe kell venni az atirasoknal
#RewriteBase /cegunkwebhelye
# Minden nemletezo oldal webcimet iranyitsuk at az index.php-re
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [QSA]
</IfModule>
Mukodik jol, de 2-3 szor futtatja le az oldat. Hosszas dibág utan kiderult:
keresi a favicon.ico-t. Mivel az nincs ott, ezert szorgalmasan dobalja az index.php-nek! Oda kell teni egy favicon.ico-t, vagy
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?node5param=$1 [QSA]
formaban kell irni a rewrite rule-t!
--
[ Dönci ]
favicon.ico, robots.txt
favicon/robots
Igaz. De ez itthon volt devel gépen. Hol vagyok meg attol, h. robots.txt-re szukseg legyen! :) Mindenesetre, ha nincs, oda kell irni a rule-ok koze...
Persze, jobb ezeket ekesziteni, egyertelmu.
--
[ Dönci ]
?PHPSESSID
http://www.web.hu/rovid/link?PHPSESSID=e175c15e20 bla bla, még egy csomo szam)
ha innen tovabb lepunk akarmelyik linkre a jelenseg megszünik, de azt szeretnem, ha mar ekkor sem lenne. van-e valami ötlet, találkozott-e valaki hasonló problémával? előre is kösz.
csak süti használatával
Kapcsold be a session.use_only_cookies beállítást, vagy nagyon régi PHP-khez az url_rewriter.tags értékét ürítsd ki.
trans_sid
Lenne egy kérdésem, megprob
A PATH_INFO + ForceType -os megoldással minden müxik, de ugye úgy van pl valami.hu/konyvek/12 itt ugye a könyvek(.php) ami feldolgozza a dolgokat, de tegyük fel azt akarom elérni hogy
valami.hu/12 , és itt azt szeretném hogy az index file, dolgozza fel hogy /12 (az a path infot-) de ugye nem szeretném hogy az legyen hogy valami.hu/index/12 mert ez ugye elég bután néz ki :)))
Szóval ha erre tudtok valami megoldást osszátok meg velem :)))
Csak rewrite vagy errordocument
ErrorDocument
Egy kis segitseget szeretnek kerni.
Adott egy oldal, ahol a rewrite_modul nem engedelyezett, ezert az url-k roviditeset ErrorDocumentes megoldassal kezelnem. Azonban, ha
van egy form-om ahol a parameterek POST metodussal kerulnek atadasra es a form action-je egy nem letezo url, akkor a redirect utan, a $_HTTP_VAR_POST valtozoban az elkuldott parameterek nincsenek benne.
Ha kiiratom a $_SERVER parametereket a kovetkezot kapom
Key: REDIRECT_REQUEST_METHOD; Value: POST (Tehat a redirect elott, meg POST)
Key: REQUEST_METHOD; Value: GET (Viszont ez mar GET, a POST helyett).
Gondolom az a gond, hogy a REQUEST_METHOD nem POST ezert, a php letre sem hozza a valtozot.
Valami otlet, hogy lehetne kikuszobolni ezt a problemat?
Szivacs. Én is csináltam
Lokálisra nem igaz
biztos?
Maat
biztos
nem, de..
Maat
Apache tervezők
magyarul
Examples:
1) http://www.anyserver/path - POST parameters are lost during processing
"ErrorDocument 404 /index.html" directive.
2) http://www.anyserver/ - POST parameters are correctly processed during
processing "ErrorDocument 404 /index.html" directive.
hogy más ne szivjon ezzel...
Eltűnő perjelek
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [QSA]
ha ezt a kérést küldöm az Apache-nak:
http://localhost/ize///bigyo////
Akkor az index.php fájlban kiíratva:
var_dump($_SERVER['REQUEST_URI']);
Az eredmény ilyesmi:
string(16) "/ize///bigyo////"
Tehát a több egymást követő perjelből egyet csinál az Apache, tudja esetleg vki, hogy ezt miért így csinálja, q értéke miért nem a "ize///bigyo////" lesz?
Attila
melyik a beállítás ami
itthon ment (apache 2.0.54), de pl ingyenes tárhelyeken (uw,fw,atw) nem. miert ?
hogyhogy nem működik?
uhh, hát ezt a kommentet
hát ez az, hogy semmi.
http://valamicim.fw.hu/rovidcimek.php/12 - erre 404es hiba jelentkezik az általam kiprobalt tárhelyeken
http://localhost/rovidcimek.php/12 - itthon meg jo és természetesen a PATH_INFO /12.
nem hiszem, hogy segít
ingyenes?
r.
phpinfo
--
Szeretettel: Károly György Tamás
kgyt&kgyt.hu - http://kgyt.hu
Egy kis segítség a RewriteRule-hoz
Már elég régóta szeretném megoldani egy otthoni apache szerveren hogy pl a 2000.rock.konyvek.home.hu web círe a következő dokumentumot adja be /www/htdocs/konyvek/rock/2000 mintha ezt adtam volna meg hogy home.hu/konyvek/2000 valamint ha igy szerepel www.2005.rock.konyvek.home.hu akkor a www-t ne vegye figyelembe. És ez persze dinamikus az az ha létrehozok egy könyvtárat akkor az el lehessen érni az előbb említett módon.
Az világos hogy a home.hu/stb/valami ben hogy tudom módosítani a /stb/valamit de a host -ot nem. Egy kis példa jól jönne.
Közben megoldottam!
IE gond - ErrorDocument használatakor
Az ErrorDocument módszert választottam, mivel a szerveren nincs rewrite modul sajnos.
Firefox-al és Operával gond nélkül müködik is, viszont IE-vel HTTP 404-es üzenet ad vissza....
Valakinek valami építő jellegű ötlete?
HTTP kód
RewriteRule érdekesen
én szeretnék egy .htaccess segítséget kérni
a felállás a következő:
vagy egy file a htdocs\projekt\misc\bar mappában és én szeretnék írni rá egy htaccess-t, hogy a www.XY.hu/projekt/misc/bar/forwarder/23454-23.png-t átalakítsa www.XY.hu/projekt/misc/bar/forwarder/index.php?id=23454&type=23 -ra
ja és a projekt/misc/bar/forwarder/index.php meghívja include-al a projekt/misc/bar/index.php-t, de úgy hogy a GET metódussal megkapott paramétert feldolgozza a meghívása elött
lehetséges ezt valahogy megcsinálni, vagy értelmetlenül írtam az egészet?
kérlek segítsetek!
Légyszíves magyarul írj!
Légyszíves próbáld meg betartani a magyar nyelv legalább alapvető szabályait. A helyes központozással, normális szavakkal (a hy például micsoda?), tagolt, nagy- és kisbetűs mondatokkal, stb. társaid tiszteled meg - vagyis azokat, akiktől segítséget kérsz.
Lehetséges, amit elképzeltél. Kicsit többet kellene tudnunk a környezetről, de feltételezve az Apache szervert, nézz utána a mod_rewrite modulnak, valamint ehhez kapcsolódóan a RewriteBase-nek, illetve a reguláris kifejezéseknek. Utóbbi táján azt kell megoldanod, hogy az X számjegyből, majd egy kötőjelből, illetve további számjegyekből, valamint .png karaktersorból álló stringet darabold úgy, hogy számjegyek, kötőjel, számjegyek (maradék elvetése) részeid legyenek.
Lehetséges, hogy a mod_rewrite működéséhez külön engedélyezned kell a .htaccess állományok figyelembe vételét, ennek pontos menete szerverkörnyezet-függő.
Netszerte számtalan oktatóanyag található, de ez például mintha épp a Te problémád feszegetné. Magyar anyagokhoz Google a barátod.
Egy-két praktikus tanács, ami valószínűleg nem derül majd ki a tutorialokból:
- Az egész procedúra nyilván használ erőforrásokat; minél nagyobb és komplexebb a .htaccess állomány, annál többet "eszik".
- Rosszul beállított szervernél az egész vasat megfektetheted egy hibás .htaccess-szel, úgyhogy illik vele otthon kísérletezni.
- Otthoni devkörnyezetben ne feledd újraindítani a szervert, miután engedélyezted a .htaccess-t
- Ingyenes tárhelyek általában nem engedélyezik .htaccess használatát.
Köszönöm válaszod!
Elméletileg egy olyan .htaccess fájlt kéne írni, ami átad egy számsort egy .php fájlnak GET metódussal.
A probléma az, hogy nem a htdocs mappában található, hanem 3 mappával lejjebb.
Azt szeretném elérni, hogy a www.XY.hu/mappa/megegymappa/bar/forwarder/23454-23.png url-t vizsgálja meg, és a számsort küldje el a feldolgozó .php-nek.
Elméletben így nézne ki:
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^(.*)/(.*)-(.*).png$ index.php?id=$2&type=$3 [L]
RewriteRule ^(.*)-(.*).png$ index.php?id=$1&type=$2 [L]
De az a probléma, hogy nem tudom, hogy értessem meg vele, a mappalokációt, ami persze nem álladnó.
A saját gépemen futtatom a .php szkripteket (xampp segítségével), de hem szeretném, ha mappafüggő lenne (projekt/misc/bar/forwarder/ stb....).
Lécci és persze ha nem gond írj egy kis scriptet, mert már kész vagyok... :(
kérés
# PHP Script Language Version 5.2.3
# MySQL Database Version 5.0.45
velük dolgozom.
a nah pl h a localhost/site/alap.php?oldal=naplo
ra szeretnék hivatkozni azt hogy teszem?
én ezzel próbálkoztam:
alap.php?oldal=naplo&bejegyzes=vasarnapi_ebed
ezt hogy tom?
Ha ezt megmondanátok konkrétan minden problémám megoldódna?
A többit a PHP-ban
A megadott elérési utat aztán a
$_SERVER['REQUEST_URI']
változóban találod, amit utána tetszés szerint felhasználhatsz.hm
egyébként már megy
URL Rewrite
Én a 4. verziót választottam (4: URL Rewrite). A példa alapján addig el is jutottam, hogy a
valami.hu/hirek címre egy case segítségével kiírja a "hírek" szót.
Azt szeretném megkérdezni hogy a híreken belül hogy lehet egy adott hírt kiírni?
Tehát valami.hu/hirek/3 címre a hármas számú hírt írja ki. Maga a hír lekérdezéssel (sql-ből) nincs problémám, csak nem látom át még annyira az egész rövid webcímes megoldást. Hogyan tudnám kinyerni a webcímből azt a számot, amelyik megadja az adott hír (nevezzük így) id számát?
Legjobb az lenne, ha nem konkrétan erre a példámra kapnék választ, hanem általánosan hogy lehet egymásra/egymásba építeni a linkeket?
Feltételezem a megoldást SWITCH-en belüli SWITCH-ek lesznek, csak a változók kinyerésére lennék kíváncsi.
tedd fel új témakánt a kérdést
nem megy...
<Directory />
AllowOverride FileInfo
</Directory>
Több helyen is ovlastam hogy httpd.conf-ba kell írni. De akárhova, akárhogyam írom be, nekem a következő hibaüzenet jelenik meg: "Internal Server Error" és a tárhelyen akármit szeretnék elérni, csak ezt látom...
mit csináljak?
httpd.conf fájlt, nem is találok a tárhelyemen. ez normális?
Szolgáltatónál érdeklődj
A helyzetet úgy tudod felmérni, hogy lefuttatod a phpinfo()-t, és megnézed a kimenetét:
Egyáltalán akkor érdemes elkezdeni foglalkozni a rövid webcímek kialakításával, ha ez megvan (még akkor sem 100%, hogy megy, de valószínű).
Kérlek, engedj meg néhány megjegyzést még:
1. Illik saját fejlesztői szerveren kísérletezni. Húzz fel egy apache-php-mysql hármast a gépedre, és avval játssz. Egyrészt ez alapvető korrektség a szolgáltatód felé, másrészt lehetőséged van sokkal gyorsabban és hatékonyabban tanulni, tapasztalni, harmadrészt kicsit tájékozottabb leszel abban a szerverkörnyezetben, amiben utána ügyködni szeretnél.
2. Kezdd el egészen egyszerű példákkal a tanulást. Építs egy pici próbascriptet, ami csak az átirányítást bizonyítja, a rövid webcímből kapott paramétereket kezeli.
3. Olvass utána az alábbi témáknak: Apache szerver telepítése és konfigurálása alapfokon, legegyszerűbb mod_rewrite opciók, HTTP státusz kódok (volt nemrég ehhez egy érintőlegesen kapcsolódó, remek cikk is), felhasználóbarát hibakezelés.
4. Feltételeztem, hogy Apache webszerverre dolgozol... :)
index.php?id=oldal1
Engem az érdekelne mit ültessek a php kódba ahhoz hogy,
ErrorDocument 404
Én kipróbálás képpen az ErrorDocument-es megoldást választottam, mivel a rewrite nekem már bevált!!
Két hibám van!!
1. Nem tetszik, hogy az apache errorlog-ja televan!!
2. Ezt szeretném használni:
http://localhost/teszt/cikkek/40
ez azt eredményezné, hogy
"feldolgozo.php"
http://localhost/teszt/cikkek/1
akkor megváltozik erre:
http://localhost/teszt/feldolgozo.php
és eltűnik a REQUEST_URI!!
Mitől lehet ez?
RealLalesz