Iskalnikom in uporabnikom prijazni URL-ji (User – SEO freindly URL – Apache, IIS)
Spletno stran tipa http://trsplet.com/prvastran/podstran/ si uporabnik lažje zapomni kot http://trsplet.com/?m=prvastran&a=podstran. Tudi iskalniki imajo lažje delo in bolje ovrednotijo URL-je oz. spletne strani, ki imajo parametre podane kot pot do imenika (folder/sub_folder/sub_sub_folder/). Seveda obstaja še kup drugih razlogov.
Poglejmo si rešitev, ki deluje tako na Apache in IIS spletnem strežniku. Opišimo najprej delovanje naše rešitve. Spletnemu strežniku podamo URL v obliki http://spletnastran.com/imenik/, spletni strežnik URL prepiše (prečisti), preusmeri oz. naredi, kar mu povemo s konfiguracijsko datoteko. PHP nato prebere URL in na podlagi tega kličemo X funkcijo oz. prikažemo Y vsebino. Seveda je podan opis zelo ohlapen, namenjen LE osnovni razlagi. Nekaj defenicij za mod_rewrite:
Provides a rule-based rewriting engine to rewrite requested URLs on the fly
This module uses a rule-based rewriting engine (based on a regular-expression parser) to rewrite requested URLs on the fly. It supports an unlimited number of rules and an unlimited number of attached rule conditions for each rule to provide a really flexible and powerful URL manipulation mechanism. The URL manipulations can depend on various tests, for instance server variables, environment variables, HTTP headers, time stamps and even external database lookups in various formats can be used to achieve a really granular URL matching.
V našem primeru bomo uporabili enostavno rešitev in sicer, vse URL-je bomo preusmerili (prepisali) na index.php datoteko. S te datoteke pa bomo potem preusmerjali in poklicali različne funkcije na podlagi podanega URL-ja. Najprej si poglejmo (enostavno) rešitev za Apache:
Potrebujete omogočen (dodan) modul - mod rewrite. Kako pretestirati, če imate mod rewrite dodan. Nato dodajte v vaš root direktorij spletne strani (document root - ./) datoteko .htaccess. Vsebina datoteke naj bo sledeča:
-
RewriteEngine on
-
RewriteCond %{REQUEST_URI} !^/phpMyAdmin/
-
RewriteCond %{REQUEST_URI} !^/static/
-
RewriteRule .* index.php
Zgoraj omenjena koda vse URL-je (kot že povedano zgoraj) preusmeri na index.php, razen tiste, ki vsebujejo /static/ imenik (ki vsebuje statično vsebino - flash; js; slike; datoteke) ali phpMyAdmin. Seveda je to v našem primeru, za vaš primer si nastavite poljubne poti. Lahko pa tudi statične datoteke servirate z pomočjo PHP-ja. PHP kodo si bomo pogledali kasneje, sedaj si oglejmo rešitev za IIS:
Uporabimo dodatek ISAPI_Rewrite 2 oz. lahko tudi ISAPI_Rewrite 3. Jaz sem uporabil ISAPI_Rewrite 2 in sicer zastonjsko verzijo ISAPI_Rewrite Lite, ki zadostuje naši enostavni rešitvi. Nekaj več o tej verziji:
This is simplified edition of ISAPI_Rewrite. It does not support per-virtual-site configurations, proxiing, metabase monitoring and automatic cache cleanup but all other features are supported. ISAPI_Rewrite Lite is completely FREE! It may be an ideal solution for the server hosting the only site, development or testing purposes.
Sama inštalacija je preprosta, dodatek se doda pod filter (ISAPI filters), potem pa v konfiguracijsko datoteko dodatka dodate sledečo kodo:
-
RewriteEngine on
-
RewriteCond %{REQUEST_URI} !^/phpMyAdmin/
-
RewriteCond %{REQUEST_URI} !^/static/
-
RewriteRule .* index.php
Več informacij o sami inštalaciji in dodatnih možnostih. Ker nimam več dostopa do strežnika kjer smo razvili to rešitev vam ne morem postreči z bolj natančnimi informacijami o inštalaciji in dodati nekaj slik, mogoče ob naslednjem projektu:P
Torej, mod rewrite ali ISAPI Rewrite na Apache ali IIS nam deluje. To lahko preizkusite tako, da vtipkate http://vasa_spletna_stran.com/tole_je_test/. To bi vas moralo preusmeriti na index.php. Sedaj moramo dodati še PHP kodo, ki bo prebrala URL s katerim je uporabnik dostopal do strani predno je mod_rewrite opravil svojo čiščenje oz. preusmeritev. PHP koda je sledeča:
-
function resolveURLFolderRequest(){
-
//RM04072007 IIS has HTTP_X_REWRITE_URL set, apache already does that into REQUEST_URI
-
$real_path = (isset($_SERVER['HTTP_X_REWRITE_URL'])) ? $_SERVER['HTTP_X_REWRITE_URL'] : $_SERVER['REQUEST_URI'];
-
-
//RM07022008 If first variable is empty, clear it
-
-
//RM07022008 Go trough folders and check if any of folder is integer, if it is take it as parameter (splited by ,)
-
foreach($folders as $folder){
-
foreach($tmp_folders as $tmp_folder){
-
}
-
}
-
else $clean_f[] = $folder;
-
}
-
-
//RM07022008 Construct path
-
Kratek opis delovanja. Mod_rewrite oz. ISAPI_Rewrite prvoten URL zapišeta v HTTP_X_REWRITE_URL oz. REQUEST_URI. URL nato obdelamo z parse_url funkcijo. Nato pogledamo ali imamo v URL-ju podane kakšne parametre, naprimer: http://trsplet.com/novice/1, kar bi pomenilo prikaži novico z ID-jem 1. Nato pot, parametre vrnemo kot tabelo (array). Zgoraj omenjeni način URL-jev omogoča tudi podajanje parametrov na standarden način, naprimer: http://trsplet.com/novice/?news_id=5&sort=modified DESC.
Kaj pa sedaj ko imamo pot ter parametre z našega lepega URL-ja? To je odvisno od vas, lahko dobite vsebino glede na pot iz baze, lahko kličete različne funkcije glede na pot itd. Naj tukaj še poudarim, da je kovačeva kobila vedno bosa, primer: http://trsplet.com/index.php?m=reference
Poglejmo si še preprost primer:
-
$url = resolveURLFolderRequest();
-
-
if ($url == 'home') {
-
} else {
-
}
Dodatne informacije:
- Članek posvečen Apache mod_rewrite. Najdete opis in nekaj primerov delovanja
- Generator .htaccess datoteke (RewriteRule index/m/(.*) index.php?m=$1)
- URL Rewrite na wikipedi
- Malo več naprednih informacij
- Podoben vodič kot trsplet.com
Delodajalec: Pangaea
Podobni članki:
- Apache htaccess preusmeritve
- PHP – Virtualne pod-domene – virtual subdomains
- Optimizacija spletne strani za iskalnike – iskalniku prijazna spletna stran – SEO
- Poljubno 404 sporočilo – Custom 404 error not found message
- Pretvorba PHP MySQL aplikacije v PHP MS SQL aplikacijo (apache, php, mdb2, mysql => iis, php, mdb2, mssql)
- PHP – Konvertiranje datotek CP1250, UTF-8 – iconv
- PHP – izdelava galerije – preprosta skripta za prikazovanje slik
- Povezava preko IIS-ja s PHP-jem na strežnik MSSQL 2005 z uporabo Windows Authentication načina (MSSQL, PHP SQLSRV, Windows, IIS)
- PHP – Kreiranje Excel datoteke – Pisanje v Excel datoteko – PHP – xls
- SVN varnostni problem – dostop do izvorne kode preko domena.com/.svn/ URL-ja



March 18th, 2008 ob 12:51 am
Hvala za članek, zanima me kako uporabljam to funkcijo resolveURLFolderRequest(). Lahko podaš kak primer?
Hvala
March 18th, 2008 ob 12:10 pm
Sem dodal pod prispevek. Če je še kaj takega kar ustreli.
March 18th, 2008 ob 11:46 pm
Mene zanima kako ta reč deluje,ker mi pri tem vsem ni nič jasnega.
March 18th, 2008 ob 11:55 pm
Lahko malce bolj podrobno defeniraš kater del ti ni najbolj jasen, da se lažje osredotočim kaj za obrazložit. Hvala. Cu jutri.
P.S: Na kratko. Mod_rewrite prepiše vse URL-je (katerikoli tipa, tudi http://spletnastran.com/lep_url/) naj se preumserijo na index.php. V index.php pa pokličeš $url = resolveURLFolderRequest(); zato da dobiš, kar je uporabnik vnesu v URL predno je mod_rewrite prepisal URL in "preusmeril" na index.php.
Postopek:
1.) Uporabnik vpiše: http://spletnastran.com/lep_url/
2.) Mod_rewrite preusmeri na http://spletnastran.com/index.php (tako smo določili v index.php) in določi nekaj konstant v $_SERVER
3.) v index.php pregledamo konstatne, ki jih je mod_rewrite nastavil. Pogledamo tiste konstante, kjer lahko vidimo kaj je uporabnik vpisal preden je mod_rewrite URL preusmeril na index.php. V našem primeru je bilo:
http://spletnastran.com/lep_url/
4.) $url = resolveURLFolderRequest(); // URL spremenljivka je /lep_url/
5.) if ($url == 'lep_url') { echo 'Uporabnik, ti si vpisal v naslovno vrstico (address bar) /lep_url/}
Vprašej kar je še kaj takega.
March 19th, 2008 ob 2:38 pm
Uh.Sedaj mi je pa malo bolje jasno
.Samo še zanima me kako pa dobim id od neke stvari na tak način http://domena.com/novica/1
March 19th, 2008 ob 4:35 pm
Zgoraj napisana funkcija vrne array:
return (array('vars' => $vars, 'path' => $path, 'folders' => $clean_f));
torej takole:
$url = resolveURLFolderRequest(); // http://domena.com/novica/1
echo 'Id novice:'.$url['vars'][0]; // izpiše Id novice: 1
Razične vrednost ločuješ z vejico, recimo ID Novice 1, Kategorija 2.
http://domena.com/novica/1,2 (1 novica, kategorija 2)
$url['vars'][0] //1
$url['vars'][1] // 2
March 19th, 2008 ob 5:19 pm
Am to deluje samo za števlike? Za celotno besedo pa ne.Mislim če napišem http://stran.com/novice/1/kategorija/2/
March 19th, 2008 ob 5:23 pm
Aja pozabil sm še to.V bistvu če dam http://stran.com/home iz includa fajl welcome.html.
$url = resolveURLFolderRequest();
if ($url == 'home') {
echo file_get_contents('home.html'); //http://spletnastran.com/home/
} else {
echo file_get_contents('welcome.html'); //http://spletnastran.com/welcome/
}
March 19th, 2008 ob 6:13 pm
Za besede ne deluje, le za številke ločeno z vejico (,).
Točno je takole (za http://stran.com/home primer).
$url = resolveURLFolderRequest();
if ($url['path'] == 'home') {
echo file_get_contents(’home.html’); //http://spletnastran.com/home/
}else{ //ali elseif ($url['path'] == 'welcome')
echo file_get_contents(’welcome.html’); //http://spletnastran.com/welcome/
}
March 19th, 2008 ob 7:38 pm
Am ja deluje tko če mam if ($url[’path’] == ‘/home/’).Ampak recimo če mam v mapi nekamapa/index.php morem tako dat kodo if ($url[’path’] == ‘nekamapa/home/’).Pa še zanima me če mam recimo takšne linke index.php?neka=stran kako potem to spremenim v friendly URL?
March 19th, 2008 ob 8:16 pm
Ja, še / sem pozabil. Glede poti. Najbolje je bo, da probaš:
$url = resolveURLFolderRequest();
print_r($url);
exit;
Potem pa poglej kaj ti vrne pod URL in si boš najlažje predstavljal.
Glede kako naredit lepe URL-je. To pa je potrebno napisat drugi mod-rewrite, to si pa poglej na pehape.si, tam je blo napisano mislim da. Boljše bi blo da na roko spremeniš index.php?neka=stran v href="/neka/stran/".
March 22nd, 2008 ob 4:02 pm
Lahko pa ustvariš rewrite rule na tej spletni strani: http://www.mod-rewrite-wizard.com/
Noter vneseš http://www.domena.si/index.php?neka=stran naštimaš nastavitve kakšen pač hočeš rezultat in ti generira rewrite rule katerega daš potem v .htaccess.
March 22nd, 2008 ob 4:46 pm
Tudi to je možnost, jaz sem pri zgoraj omenjeni rešitve bolji gledal da deluje na IIS ter apache in je najbolj simple možn (en rewrite rule). Drugač pa dobra stran mod-rewrite-wizard:P
April 7th, 2008 ob 11:25 am
[...] Poglejmo si PHP kodo, ki jo uporabimo v povezavi z iskalnikom in uporabnikom prijazni URL-ji. Uporabnik vnese http://spletnastran.com/stran_ki_ne_obstaja/ v naslovno (URL) vrstico brsklanika, PHP koda pa vrne 404 napako ter servisa našo poljubno 404 error not found sporočilo. Še enkrat, ta način deluje z zgoraj omenjenim mod_rewrite za apache oz. ISAPI_Rewrite za IIS. PLAIN TEXT PHP: [...]
April 9th, 2008 ob 11:17 pm
[...] Iskalnikom in uporabnikom prijazni URL-ji (User - SEO freindly URL - Apache, IIS) [...]
June 28th, 2008 ob 9:32 am
[...] delovanja je podoben kot pri kreiranju prijaznih URL-je za uporabnika in iskalnike. Karkoli uporabnik vpiše v naslovno vrstico (address bar) mod_rewrite modul preusmeri na našo [...]
February 1st, 2009 ob 9:07 pm
Živjo, kako pa bi s .htaccess spremenil take naslove:
=> index.php?jezik=en&stran=kontakt
=> en/kontakt
in da bi style.css in slike delale
LP
February 3rd, 2009 ob 10:09 am
RewriteRule index.php.php?jezik=([a-z]+)&stran=([a-z]+) /$1/$2
February 3rd, 2009 ob 3:52 pm
Roky zakaj pa ni:
RewriteRule index.php?jezik=([a-z]+)&stran=([a-z]+) /$1/$2
?
February 3rd, 2009 ob 3:53 pm
Sorry, napaka. tako je kot si ti napisal, tist .php je brezveze.
February 3rd, 2009 ob 8:20 pm
Aha ... lohk samo še nekaj vprašam?
recimo ... imam dva linka:
index.php?stran=uporabniki&akcija=uredi
index.php?stran=clanki&id=19
Potem moram v .httaccess dodati tole:
RewriteRule index.php?stran=([a-z]+)&akcija=([a-z]+) /$1/$2
RewriteRule index.php?stran=([a-z]+)&id=([0-9]+) /$1/$2
?
February 3rd, 2009 ob 9:37 pm
ja res je, najbolje da malce probavaš, ker jaz tudi na pamet ne vem:)
February 3rd, 2009 ob 9:48 pm
Aha ... torej moram za vsako kombinacijo strani, ki se lahko zgodijo na spletnem portalu posebej napisati pravilo?
Dela tudi na WIndows XAMPPu?
February 3rd, 2009 ob 9:58 pm
deluje.
October 21st, 2009 ob 6:40 pm
[...] uporabniku prijazne URL-je o katerem smo že pisali na T&R splet blogu [...]
November 23rd, 2009 ob 2:01 pm
Zdravo
Poskušam tole nekako naredit, vendar ko dodam datoteko .htaccess se mi poruši dizajn... v izvorni kodi je pravilna pot do .css fajla, vendar ga ne dobi... :/ Verjetno moram nekako določit izjemo za te datoteke, da jih lahko bere... Pa ne vem kako, ker prvič delam z .htaccess. Nekaj sem probaval ampak ne gre... Datoteke ki jih berem imam v več mapah (js, template), moram potem vse pisati? in pa tudi podmape, ker v template imam seveda več datotek? al se da z * al kako drugače rešit?
November 23rd, 2009 ob 2:04 pm
Dodej v htaccess pred rewriteRule te dve vrstici:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
November 23rd, 2009 ob 2:15 pm
Hvala, sem opazu prej da sem meu sam napako v kodi, naslov template namesto templates... Sedaj deluje, hvala.
Lahko samo še razložiš ti dve vrstici na kratko kaj pomenita ki si ju napisal?
November 23rd, 2009 ob 2:23 pm
Pomenita, da če je datoteka ali imenik, ki dejansko obstaja na disku (file system) potem za njiju ne naredi rewrite (preusmeritev) ampak jih normalno prebere.