[PHP] Jak prakticky vyřešit mod_rewrite ?

Webdesign, HTML, CSS, Flash, PHP, ASP, .NET, JavaScript. Kritika www stránek na Smetišti.

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod lví srdce 3. 1. 2007 16:20

Už jsem ze všech parametrů, závorek, lomítek a otazníků celý paf
Pomůže mi někdo vyřešit praktický příklad ... prosím.

Mám adresu:
http://www.cokoliv.cz/?p=productsMore&iProduct=5

Co mám napsat do .htaccess abych dostal
http://www.cokoliv.cz/neco-pekneho

Děkuji za radu.


// mbing : Téma přesunuto ● z Programování do Tvorba webových stránek a aplikací.
lví srdce
Junior
Uživatelský avatar

Odeslat příspěvekod Z@chi 3. 1. 2007 19:16

tohle se tady resilo uz mnohokrat a na internetu je i hodne tutorialu.
Vytovoris si soubor, do ktereho budes smerovat sve odkazy. tedy napriklad index.
A pomoci regularnich vyrazu v .htaccess si potom vytvoris podminku.

Jednoduse to muzes udelat treba takto:
Kód: Vybrat vše
RewriteEngine on
RewriteRule     ^(.*)$   /index.php?q=$1 [L,QSA]

- to je velice jednoduchy priklad.
Z@chi
Junior
Uživatelský avatar

Odeslat příspěvekod lví srdce 3. 1. 2007 22:39

Bylo to tu mnohokrát to vím, ale ze všech článků co jsem prošel mi žádný nepodal ucelený obraz. Chápu že v .htaccess musím zapnout mod_rewrite, pak nějakou hatmatilkou :) zadat co se má dít čož sám nevytvořím a potom ten nějaký soubor, do kterého směřuji odkazy, to slyším dnes prvně ...
lví srdce
Junior
Uživatelský avatar

Odeslat příspěvekod cache 3. 1. 2007 22:44

Ak to mas na freehoste, tak predpokladaj, ze mod_rewrite, ci dokonca .htaccess ani nefunguje.

Jednoduchsie (hlavne pre neznalca) je pouzivat toto:

http://www.cokoliv.cz/index.php/neco-pekneho

Vzdy sa zavola index.php v REQUEST_URI budes mat potom "/index.php/neco-pekneho" a z toho si vies velmi jednoducho ziskas to "neco-pekneho".

Alebo v PATH_INFO mas "/neco-pekneho" (tusim).

Samozrejme namiesto index.php mozes mat akekolvek php, nemusi to byt nutne index.php.
Můj bože, to je budoucnost! Mí rodiče, přátelé, má dívka.. Už je nikdy neuvidím.. JUPÍÍÍÍÍÍ! (Fry s1e1)
cache
Pokročilý
Uživatelský avatar

Odeslat příspěvekod Zorg 3. 1. 2007 22:51

Máš to trochu popletené, mod_rewrite směřuje adresy http://www.cokoliv.cz/neco-pekneho na http://www.cokoliv.cz/?p=productsMore&iProduct=5 ne obráceně. Ty mu potom jenom píšeš pravidla co kam má směrovat a jak. Skvělá dokumentace s hromadou příkladů je tady: http://httpd.apache.org/docs/2.0/misc/rewriteguide.html To cos napsal ty bohužel není praktický příklad.
Zorg
Junior

Odeslat příspěvekod Gigi 3. 1. 2007 23:28

Asi nejlepší metodou pro tebu bude něco jako:
Kód: Vybrat vše
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]


V souboru index.php pak podle $REQUESTED_URI zobraz prislusny obsah stranky.
Gigi
Junior

Odeslat příspěvekod lví srdce 4. 1. 2007 08:36

Co mi píšete je všechno moc pěkné, každý mi dá kousek do skládačky ... ale pořád mi tam neco chybí ... nehnu se z místa. Server mi .htaccess umožňuje, jinak bych se ani neptal. Ale co tam do něj přesně napsat :)
lví srdce
Junior
Uživatelský avatar

Odeslat příspěvekod Zorg 4. 1. 2007 16:30

Nenapsal jsi co chceš, nevím co ti napsat. A cos napsal je blbost, mod_rewrite ti z /neco.php?hromada_divnychparametru=blabla nikdy neudělá /neco-pekneho, jak píšeš odkazy je jen a jen na tobě.
Zorg
Junior

Odeslat příspěvekod lví srdce 4. 1. 2007 17:11

Teď už to vím, že co jsem napsal je blbost... najde se prosím nějaký mooc vzdělaný pán v PHP a vyřeší tento pro mě zapeklitý problém ? Kuju
lví srdce
Junior
Uživatelský avatar

Odeslat příspěvekod 2ge 4. 1. 2007 17:28

vsetko to tu uz mas napisane, ak ti to nepomohlo hladaj viacej na nete. V php si daj vypisat print_r($_REQUEST) - z@chiho riesenie v druhej odpovedi pouzivam aj ja (zjednodusene) a vsetko slape ako ma. Co sa tyka PHP, daj si toto vypisovat a linky zobrazuj ako http://nieco.com/pekne/url a uvidis sam co to bude robit a podla toho koduj dalej.
SubDownloader - stahuj a nahravaj titulky k filmom pomocou opensource programu z OpenSubtitles.org
2ge
Junior
Uživatelský avatar

Odeslat příspěvekod kecso 4. 1. 2007 17:43

vyskúšaj toto


RewriteEngine on
RewriteRule ^neco-pekneho/ /index.php?p=productsMore&iProduct=5
kecso
Kolemjdoucí

Odeslat příspěvekod lví srdce 4. 1. 2007 18:05

Abych uvedl vše na pravou míru ... v PHP jsem lama a jediná věc co musím udělat v php je pouze právě hezká adresa.

Všechno zkouším na straně serveru. Výše uvedené příklady prostě zkopíruju do .htaccess a pak se těším, že je hotovo a nic. Myslím si že mi uniká ta souvislost, že je třeba zasáhnout do index.php, což je pro mě dost nepohodlné.
lví srdce
Junior
Uživatelský avatar

Odeslat příspěvekod babca 4. 1. 2007 19:04

Zorg píše: To cos napsal ty bohužel není praktický příklad.k/quote]

No ale pokud nemá rewrite povolenej, tak jediná možnost...

To Lví srdce: jede ti vůbec htaccess?
babčův HTPC pro rok 2011: AMD Zacate, spotřeba 16W@46°C při idle, just Google it
babca
Junior
Uživatelský avatar

Odeslat příspěvekod lví srdce 4. 1. 2007 19:28

Jasně že jede ... hosting mam u Active 24
lví srdce
Junior
Uživatelský avatar

Odeslat příspěvekod Zorg 4. 1. 2007 20:14

babca píše:
Zorg píše: To cos napsal ty bohužel není praktický příklad.k/quote]
No ale pokud nemá rewrite povolenej, tak jediná možnost...
./quote]

Myslel jsem to jinak, že to není otázka, na kterou se dá odpovědět. Něco jako by ses zeptal "jaký je u nás počasí" a neřekl kde jsi.

Výše uvedené příklady ani jeden nefungují, protože už z principu nemůže existovat žádný obecný návod, který jenom zkopíruješ a jedeš. Navíc ti podle mě zatím pořád nedochází, že kromě zprovoznění mod_rewrite budeš muset projít celý kód webu a upravit generování odkazů na ty hezký (samozřejmě pokud jsi nepoužil už hotový systém, který by s tím počítal, třeba Drupal). Tedy vycházím z toho, že se snažíš o hezká URL pro celý web, ne jenom to jedno :-)
Zorg
Junior

Odeslat příspěvekod mylan4 4. 1. 2007 20:19

kecso píše:vyskúšaj toto


RewriteEngine on
RewriteRule ^neco-pekneho/ /index.php?p=productsMore&iProduct=5=/quote]


tiez som robil nieco v PHP, nahodou som prisiel na tento thread a to co si napisal som odskusal a funguje mi to! :D ani som nevedel, ze nieco take existuje, dakujem za dobry tip :mrgreen:
mylan4
Junior

Odeslat příspěvekod kecso 4. 1. 2007 22:37

nemáš začo som rad keď som vedel pomôcť
kecso
Kolemjdoucí

Odeslat příspěvekod LastHunter 13. 1. 2007 11:21

Shrnutí:

Takže, mod_rewrite ti pomůže zbavit se jakéhokoli ".php" v adrese, to jsi pochopil. Pokud chceš svému skriptu předat parametr "neco-pekneho", musíš naučit PHP skript, aby s tím uměl zacházet. Teď to máš nastavené na parametr ID, takže v databázi hledáš řádky podle ukazatele ID. Musíš si přidat do tabulky další sloupec, do kterého budeš ukládat tzv. "SEO URL" tvar nějakého nadpisu, nebo položky, bůhví co to je. Takže v redakčním systému si musíš doprogramovat, aby se ti z "Něco pěkného" hodilo do nějaké proměnné "neco-pekneho" (tj. zbavit se diakritiky, převést vše na malá písmena a mezery a další znaky převést na pomlčky, případně smazat více pomlček vedle sebe).
PHP skript pro čtenáře pak upravíš, aby nedělal MySQL dotaz

Kód: Vybrat vše
....where id='5'


ale

Kód: Vybrat vše
seo_sloupec='neco-pekneho'


(samozřejmě na proměnné).

Teď seš ve stádiu, kdy tvůj PHP skript už reaguje ne na index.php?id=5, ale např. na index.php?clanek=neco-pekneho. Pokud těch parametrů budeš mít víc, je chytřejší to vyřešit jak napsal cache - přes REQUEST_URI, pak můžeš udělat tvar linku index.php/clanek/neco-pekneho. Pak si musíš vyřešit pořadí těch parametrů v PHP skriptu, protože teď není jasné, která položka za lomítkem znamená co (v _GET je to jasné, tam má v poli každá položka svůj klíč a hodnotu).

Teď se musíme zbavit toho index.php. A právě přicházi na řadu mod_rewrite.
Pro články na svém webu to vyřešíš takto:
Kód: Vybrat vše
RewriteEngine on
RewriteRule ^clanek/$ / [R,L]
RewriteRule ^clanek$  / [R,L]
RewriteRule ^clanek/(.*)/  /clanek/$1 [R,L]
RewriteRule ^clanek/(.*)  /index.php/clanek/$1 [L]


Tento příklad zahrnuje i ošetření, pokud někdo zadá pouze /clanek/ - uživatelé to rádi dělají v domnění, že se dostanou na nějaký seznamy článků - v tomto případě je přesměrovávám na hlavní stránku - /. A aby mi zbytečně neklesal pagerank a neměl duplicitní záznamy, upřednostňuju zápis clanek/neco-pekneho. V případě, že zadá variantu ještě s lomítkem na konci, přesměruju ho na verzi bez lomítka a teprve tam m podstrčím index.php...

Uvedené řešení k plné spokojenosti používám na svém http://www.lasthunter.cz :)

Něco nejasného? :)
LastHunter
Junior

Odeslat příspěvekod suk 13. 1. 2007 23:30

pokud nechces menit databazi, muzes to udelat tak ze ID budes predavat v adrese treba /clanky/12-tohle-je-hezka-adresa
na to by byl regexp asi
RewriteRule clanky/([0-9]+)\-(.*) http://www.cokoliv.cz/?p=productsMore&iProduct=$1 [L,QSA]
Pokud nesouhlasíte s mým názorem, popřemýšlejte sami nad sebou. Opravdu si myslíte, že já bych se mohl mýlit?
----
You are an inspiration for a birth control...
suk
Mírně pokročilý
Uživatelský avatar

Odeslat příspěvekod LastHunter 14. 1. 2007 08:49

suk píše:pokud nechces menit databazi, muzes to udelat tak ze ID budes predavat v adrese treba /clanky/12-tohle-je-hezka-adresa
na to by byl regexp asi
RewriteRule clanky/([0-9]+)\-(.*) http://www.cokoliv.cz/?p=productsMore&iProduct=$1 [L,QSA]


Nojono, ale pak mu nastane problem jako je treba na novinky.cz - bude se moct podstrcit nazev clanku... Napr. /clanky/12-admin-je-hovado
LastHunter
Junior

Odeslat příspěvekod cache 14. 1. 2007 10:53

tak si este moze spravit proceduru kontrolujucu nazov. Selectne si podla ID clanok z db, nejaka procedura mu vypluje link-nazov (ta ista co s nou generuje linky na klikanie) a porovna, ze ak napisana url nebola 12--nazov-clanku tak to presmeruje na titulku, alebo hodi 404.
Můj bože, to je budoucnost! Mí rodiče, přátelé, má dívka.. Už je nikdy neuvidím.. JUPÍÍÍÍÍÍ! (Fry s1e1)
cache
Pokročilý
Uživatelský avatar

Odeslat příspěvekod malotraktor 21. 1. 2007 10:15

No pokud jde o rozsáhlejší web tak je lepší vrážet celé urlko do jedné proměnné a tu pak PHP pitvat tedy .htaccess:
Kód: Vybrat vše
RewriteEngine on

RewriteCond %{REQUEST_URI} ^([a-zA-Z-0-9"\"+/!.´',_\)\(\*\\)(\)]{1,150}).html [NC]
RewriteRule ^([a-zA-Z-0-9"\"+.!'´,/_\*\)\(\)]{1,150}).html /index.php?k=$1
[/
Pak pomocí PHP stačí rozebrat proměnou K a volat příslušnou stránku, nebo část stránky(jednotlivé funkce). Já například používám tohle:

Kód: Vybrat vše
function rozdelovacstred(){
$k=$_GET['k'];
$retezec=explode('/',$k);
$k1=$retezec[0];
$k2=$retezec[1];
$k3=$retezec[2];
$test=substr($retezec[0], 0, 10);
if($test=='stahnout_p'){
$k1=$test;
}
if($k1=='hledej'){
$k1='hledej';
}                                                     
if($test=='stahnout_pr'){
$k1='stahnout_p';
}
if($k2){
$k1='podkat';
}
if($k3){
$k2='program';
}
  switch  ($k1)
  {
  case 'stahnout_p':
        abeceda();
  break;
  case 'hledej':
        hledej();
  break;
  case 'hlasov':
        hlasujuproti();
  break;
  case FALSE:
        index();
  break;
  case 'podkat':
            switch($k2){
              case 'program':
                  vypsatprogramy();
              break;
                         
              default:
                  vypsatpodkategorie();
            break;

            }
  break;
   
  default:
  vypsatkategorie();

}
}

Zdá se mi lepší pomocí php pitvat jeden dlouhý řetězec než pomocí regulárních výrazů rozbíjet celé URL, ošetřovat výjimky a psát všechny možné kombinace.
malotraktor
Junior

Odeslat příspěvekod babca 24. 1. 2007 19:52

LastHunter píše:Nojono, ale pak mu nastane problem jako je treba na novinky.cz - bude se moct podstrcit nazev clanku... Napr. /clanky/12-admin-je-hovado


A v cem je to tak spatny? Jen se ptam, nic me nenapada.
(mozna ze do cizich diskuzi muzu hodit upravenej link)
Dky.
babčův HTPC pro rok 2011: AMD Zacate, spotřeba 16W@46°C při idle, just Google it
babca
Junior
Uživatelský avatar

Odeslat příspěvekod lví srdce 2. 2. 2007 11:38

Jsem moc rád za všechny odpovědi. Ale pořád se z toho nemůžu vyhrabat ... asi mi něco uniká.

1. Do .htaccess umístím:

Kód: Vybrat vše
RewriteEngine on

RewriteCond %{REQUEST_URI} ^([a-zA-Z-0-9"\"+/!.´',_\)\(\*\\)(\)]{1,150}).html [NC]
RewriteRule ^([a-zA-Z-0-9"\"+.!'´,/_\*\)\(\)]{1,150}).html /index.php?k=$1
[/
2. Do nějakého externího souboru třeba ... url.php vložím:

Kód: Vybrat vše
function rozdelovacstred(){
$k=$_GET['k'];
$retezec=explode('/',$k);
$k1=$retezec[0];
$k2=$retezec[1];
$k3=$retezec[2];
$test=substr($retezec[0], 0, 10);
if($test=='stahnout_p'){
$k1=$test;
}
if($k1=='hledej'){
$k1='hledej';
}                                                     
if($test=='stahnout_pr'){
$k1='stahnout_p';
}
if($k2){
$k1='podkat';
}
if($k3){
$k2='program';
}
  switch  ($k1)
  {
  case 'stahnout_p':
        abeceda();
  break;
  case 'hledej':
        hledej();
  break;
  case 'hlasov':
        hlasujuproti();
  break;
  case FALSE:
        index();
  break;
  case 'podkat':
            switch($k2){
              case 'program':
                  vypsatprogramy();
              break;
                         
              default:
                  vypsatpodkategorie();
            break;

            }
  break;
   
  default:
  vypsatkategorie();

}
}



3. Ale pořád netuším kam psát vytoužená pěkná url ?
lví srdce
Junior
Uživatelský avatar

Odeslat příspěvekod lví srdce 3. 2. 2007 20:02

Zapeklitý problém toto ... nedaří se mi jej vyřešit .... ;(
lví srdce
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků