Autor Zpráva
trewix
Profil *
Ahoj,

potřeboval bych porat s mod_rewrite. něco už jsem na tohle téma nastudoval ale pořád mi není jasný princip, kdy třeba pokud mám

odkaz na kategorii zboží, jakým způsobem nahradim např. www.obchod.cz/index.php?kategorie=5 za www.obchod.cz/televizory.

Jakým způsobem vygeneruju linky? A jak následně "hezké" linky převedu do SQL příkazu pro výpis konkrétní kategorie podle ID?

Díky za všechny rady
imploder
Profil
A jak následně "hezké" linky převedu do SQL příkazu pro výpis konkrétní kategorie podle ID?
mod_rewrite nijak neřeší propojení stránek s databází. www.obchod.cz/televizory prostě bude odkazovat na totéž, co www.obchod.cz/index.php?kategorie=5. Aby se hodnota proměnné kategorie převedla na správný SQL příkaz, o to už se musí postarat skript. Když ten funguje, mod_rewrite na tom nic nemění. Jestli to správně chápu, mod_rewrite je něco jako červí díra.
BetaCam
Profil
trewix
jakým způsobem nahradim např. www.obchod.cz/index.php?kategorie=5 za www.obchod.cz/televizory.

Takovéhle přesměrování se většinou řeší až na úrovni aplikace. S tim že mod_rewrite vše směřuje na index.php ( ve většine případů ) a aplikace vyhodnotí URI a podle toho vypíše správný obsah.

Slo by to sice řešit i přímo pomocí mod_rewrite pravidel, ale to by bylo na hlavu protože by si musel mít pro každou kategorii v .htaccess samostatné pravidlo.

Pokud by ti jako výsledné URL stačilo třeba www.obchod.cz/5-televizory tak to už se dá řešit celkem jednoduše přímo v .htaccess

Jakým způsobem vygeneruju linky?

stejně jako to dělá aplikace ted. Jen změníš způsob konstrukce linků tak, aby odpovídal pravidlům v .htaccess
trewix
Profil *
ok, takže pokud tomu rozumím dobře, tak by to šlo snad takhle: v mysql budu mít tabulku s kategoriema: id, nazev kategorie a "url-alias". při generování např odkazů na kategorie doplnim do <a> hodnotu url-alias z MySQL. odkaz bude vypadat např. takhle hezky www.obchod.cz/televizory. ale teď nevím jakým způsobem pořešit, že mi vlastně zmizela proměnná GET, takže nejsem schopný vytáhnout požadované data z MySQL. sorry za moji tupost, ale jsem asi i dost zmatený z fungování htacces.
BetaCam
Profil
trewix
v mysql budu mít tabulku s kategoriema: id, nazev kategorie a "url-alias". při generování např odkazů na kategorie doplnim do <a> hodnotu url-alias z MySQL. odkaz bude vypadat např. takhle hezky www.obchod.cz/televizory.“

Třeba.

$uri = trim($_SERVER['REQUEST_URI'], '/');
mysql_query('SELECT * FROM table WHERE alias = '.$uri);


Samozdřejmě si to mušíš patřičně ošetřit. A pokud to budeš dělat takhle tak nezapomenout dát na ten sloupec index.
imploder
Profil
trewix
Proměnná GET nikam nezmizela, jen se nezobrazuje v adrese. Server zařídí přesměrování na správnou adresu včetně hodnot proměnných GET. Skript se bude chovat stejně jako kdyby byl spuštěn pomocí www.obchod.cz/index.php?kategorie=5. Adresa www.obchod.cz/televizory je jen zástupné pojmenování. Je to jako když se Velkému Meziříčí říká taky Velmez, protože je to kratší. Město je to pořád stejné nezávisle na tom, jakou přezdívku si pro něj lidi vymyslí.
BetaCam
Profil
imploder
Proměnná GET nikam nezmizela, jen se nezobrazuje v adrese. Server zařídí přesměrování na správnou adresu včetně hodnot proměnných GET.

Ale zmizela.

Adresa www.obchod.cz/televizory je jen zástupné pojmenování.

No to sice je, ale v tom případe by musel mít pro kazdou kategorii vlastní pravidlo. Protože nemá podle čeho odvozovat na link í www.obchod.cz/index.php?kategorie=XXX
imploder
Profil
Cesta je "50 km po dálnici a pak doleva". Této cestě říkáš "cesta do Velmezu". Server to ví a tak tam trefí, ať už to řekneš jedním způsobem nebo druhým. A o tom to je, jestli se nemýlím.
imploder
Profil
http://www.jakpsatweb.cz/server/mod-rewrite.html - sekce Proměnné z regulárů
BetaCam
Zvláštní pravidlo pro každou kategorii asi bude muset mít. Já tomu ale moc nerozumím, nevím, jestli se to dá nějak zefektivnit.
trewix
Profil *
paráda, díky, pro tájemce ještě doplním jakým způsobem sem zajistil směřování všech odkazů na index

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

ještě jednou díky, všem
BetaCam
Profil
imploder
Tak nevim jaké máš skušenosti RW, ale zdřejmě jich máš víc než já ikdyž podle mého názoru já jich mám docela dost. Byl bych tedy rád kdyby si mě poučil a vysvětlil mi jak z URI která je:

www.obchod.cz/televizory


Získám identifikátor pro podstrčení v tomhle případě je to číslo 5.

Sem velice zvědav jak ho z toho stringu vyloudíš.
BetaCam
Profil
Zvláštní pravidlo pro každou kategorii asi bude muset mít.

To by sice mohl mít, ale v praxi si to nedovedu představit. Pokud by se jednalo třeba o obchod kde by bylo 20 kategorií a v každé by bylo třeba 20 produktů tak už by musel mít 400 RW pravidel a ty by se musela při každém požadavku na server vyhodnocovat. Pro praxi prostě nepoužitelné.
imploder
Profil
BetaCam
Já nic takového netvrdím. Nepopírám, že to bude muset poctivě do toho souboru vypsat jedno po druhém. Neexistuje systematický vztah, který by jednoznačně spojoval slovo "televizory" s číslem 5 a stejně tak ostatní názvy s ostatními čísly. Počítač není jasnovidec. A o mod_rewrite vím skutečně prd, mně to ani nešlo rozchodit. V tom návodu to je a to je podstatné.

Myslel jsem, že problém pramení z nepochopení, že mod_rewrite funguje na úrovni serveru, nezávisle na samotných skriptech.
imploder
Profil
BetaCam
To by sice mohl mít, ale v praxi si to nedovedu představit. Pokud by se jednalo třeba o obchod kde by bylo 20 kategorií a v každé by bylo třeba 20 produktů tak už by musel mít 400 RW pravidel a ty by se musela při každém požadavku na server vyhodnocovat. Pro praxi prostě nepoužitelné.
Tak pak buď najde nějaký přijatelný vzorec, podle kterého bude názvy generovat, nebo to prostě nebude tak mít. Nikdo netvrdí, že je nutné mít takovou zkratku pro všechny výrobky. Jak náročné je vyhodnocování pravidel nevím. Nabízí se jednoduché řešení: místo kódu výrobku se bude do proměnné dávat jeho název (tedy pojmenování určené pro zobrazení v adrese) a výrobek se určí podle něj. Mod_rewrite bude sestávat pouze z pravidla převádějícího www.obchod.cz/televizory na www.obchod.cz/?kategorie=televizory.
BetaCam
Profil
imploder
Sorry ja se omlouvám, že sem tak vyjel. Sem dneska nejakej podrážděnej z práce.

Nepopírám, že to bude muset poctivě do toho souboru vypsat jedno po druhém. Neexistuje systematický vztah, který by jednoznačně spojoval slovo "televizory" s číslem 5 a stejně tak ostatní názvy s ostatními čísly.

Jistě server jako takoví to neví, ale aplikace už ano. Proto se dnes také většinou pres mod_rewrite řeší pouze posílání veškerých požadavků na vstupní bod aplikace a samotné routování už obstarává aplikace sama protože ta přesně ví co se po ní chce.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: