[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 mylan4 4. 1. 2007 21: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 23:37

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

Odeslat příspěvekod LastHunter 13. 1. 2007 12: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 14. 1. 2007 00: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 09: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 11: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 11: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 20: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 12: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 21:02

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

Předchozí stránka

Kdo je online

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