Autor Zpráva
Prkny
Profil
Zdravím,

uvažuji udelat rewrite na stávající web. Zatím řeším teorii.
Mám stávající web klasika "soubor.php?promena=12345" , kdyz udelam rewrite (teorie) treba neco jako "www.domana.cz/hezka-url-12345",
1) stavajcíí soubor a adresa bude fungovat ?
2) dá se stavající adresa přeposlat na hezkou adresu ?

jde o to aby kdyz uzivatele i vsude na internetu mam puvodni adressy typu soubor.php?promena=12345 tak aby i tyto uzivatele se dostali na puvodni adresu

JDe to nejak resit a jak ?
Předem díky ...
pEeLL
Profil
myslim ze tady najdes odpovedi
http://www.jakpsatweb.cz/server/mod-rewrite.html
Prkny
Profil
ok, diky pročetl jsem to cele, ale presto mám problém a nevím jak mám zajistit aby i puvodní stare osklivé jeste nejaky cas fungovali ?
Tudíž přesměrovali na hezkou adresu?
přemýšlím že bych to měl asi udělat přímo na začátku skriptu soubor.php?promena=12345 ale jak ? nebo to jde udelat přímo v .htaccess ?
srigi
Profil
Malo by to ist v pohode, len to URL www.domena.cz/hezka-url-12345, ten retazec hezka-url- sa nesmie menit!
RewriteRule ^.*\/promnena=(.*)$ www.domena.cz/hezka-url-$1 [R=301]
cca takto nejako. Presmerovanie R301 zaisti, ze ked uzivatel (a aj google) zada staru URL, presmeruje ho to na ten novy tvar.
BetaCam
Profil
srigi
Malo by to ist v pohode, len to URL www.domena.cz/hezka-url-12345, ten retazec hezka-url- sa nesmie menit!

Pochybuji, že by se neměnil. Většinou se používa třeba www.domena.cz/tady-je-nazev-clanku-12548

Kde 12548 je jedinečné ID nejakého článku. Takovéhle věci se musí řěšit na úrovni aplikace. Tedy samozdřejmě pokud autor nechce URL ve tvaru www.domena.cz/clanek-(id)
Prkny
Profil
jasné je že "hezka-url" se bude měnit ...
takže chapu, že přesměrování se provede na začátku skriptu php...

muzete mi pomoci zřejmě se to bude řešit podmínkou něco jako kdyz nazev adresy je soubor.php?promena=neco --- přesměruj na cool url...
ale jak otestuji tuto url adresu ?
BetaCam
Profil
Prkny

Takovej nástin

$url = 'soubor.php?promena=123456';

if (preg_match('/soubor\.php\?promena=([0-9]*)/', $url, $matches)) {
	$result = mysql_query('SELECT id, title FROM tabulka WHERE id='.$matches[1].' LIMIT 1');
	$data = mysql_fetch_assoc($result);
	
	header("HTTP/1.1 301 Moved Permanently");
	header("Location: /".$data['title']."-".$data['id']);
	header("Connection: close");
	exit;
}


místo $url si dáš asi $_SERVER['REQUEST_URI'].
$data['title'] si ošetříš tak jak ošetřuješ tvoje url.
Prkny
Profil
BetaCam diky moc

nyní řeším samotný .htaccess
potřebuji rewritovat celkem tři soubory ale moc mi to nejde ...
mám
1) www.domena.cz/nazev-zbozi-423.html - řeší soubor nazev.php?id=423
2) www.domena.cz/katalog-regály/ - řeší soubor katalog.php?kat=regaly
3) www.domena.cz/katalog-regaly/drevene/ - řeší soubor katalog2.php?kat=regaly$podkat=drevene
4) www.domena.cz/katalog-regaly/drevene/barevne/ - řeší soubor katalog2.php?kat=regaly$podkat=drevene$podkat2=barevne

za nadpisem katalog nemusi byt "-" muze byt "/"
Zatím mám něco takového:

RewriteEngine On
RewriteBase /
RewriteRule ^(.*).html nazev.php?id=$1
RewriteRule ^katalog-(.*)/  katalog.php?kat=$1
RewriteRule ^katalog-(.*)/(.*)/  katalog2.php?kat=$1&podkat=$2
RewriteRule ^katalog-(.*)/(.*)/(.*)  katalog2.php?kat=$1&podkat=$2podkat2=$3


ale moc mi to nefunguje, prosím o pomoc
BetaCam
Profil
RewriteEngine On
RewriteRule ^(.*)-([0-9]*)\.html$ nazev.php?id=$2 [L, QSA]

RewriteRule ^katalog-(.*)/$  katalog.php?kat=$1 [L, QSA]
RewriteRule ^katalog-(.*)/(.*)/$  katalog2.php?kat=$1&podkat=$2 [L, QSA]
RewriteRule ^katalog-(.*)/(.*)/(.*)/$  katalog2.php?kat=$1&podkat=$2podkat2=$3 [L, QSA]
Prkny
Profil
RewriteEngine On
RewriteRule ^(.*)-([0-9]*)\.html$ nazev.php?id=$2 [L, QSA]
RewriteRule ^katalog-(.*)/$ katalog.php?kat=$1 [L, QSA]
RewriteRule ^katalog-(.*)/(.*)/$ katalog2.php?kat=$1&podkat=$2 [L, QSA]
RewriteRule ^katalog-(.*)/(.*)/(.*)/$ katalog2.php?kat=$1&podkat=$2podkat2=$3 [L, QSA]

Bohuzel toto nefunguje.
Píše to chyba serveru. Nastala vnitřní chyba ..... Bud je server pretizen nebo doslo k chybe v CGI skriptu. Error 500
Prkny
Profil
může mi nekdo pomoci ?
hází to chybu Error 500, pokud odendám místo [L, QSA] a necham pouze [QSA] tak to chybu 500 neháže. na co je to "L" ?

Druhý problém pokud tam nemám L tak ve třetí podmínce:
tak odkazuji na www.domena/katalog-regaly/drevené/ - kliknu a v adresnim radku to hleda www.domena/katalog-regaly/drevené/index.php
Proc tam pridava dodatek index.php ?? Díky tomu vyskočí Error 404 ...
BetaCam
Profil
Prkny
hází to chybu Error 500, pokud odendám místo [L, QSA] a necham pouze [QSA] tak to chybu 500 neháže. na co je to "L" ?

"L" říká dál už nic nepřepisuj. Error 500 to vyhazovalo z mé chyby zápisu a jelikož sem ten zápis množil copy&paste stylem tak sem tam tu chybu nasekal celkem 4x. Místo [L, QSA] mělo být [L,QSA]. Další chyba tam byla u posledního pravidla kde mezi "podkat=$2" a "podkat2=$3" chyběl &

Jinak sem ti ty pravidla přepsal na dvě varianty použít můžes tu, která ti bude víc vyhovovat.

Varianta 1 :

RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !^(.*)-([0-9]*)\.html$
RewriteRule ^(.+[^/])$ /$1/ [R=301,L]

RewriteRule ^(.*)-([0-9]*)\.html$ /nazev.php?id=$2 [L,QSA]

RewriteRule ^katalog-([a-z]*)/$ /katalog.php?kat=$1 [L,QSA]
RewriteRule ^katalog-([a-z]*)/([a-z]*)/$ /katalog2.php?kat=$1&podkat=$2 [L,QSA]
RewriteRule ^katalog-([a-z]*)/([a-z]*)/([a-z]*)/$ /katalog2.php?kat=$1&podkat=$2&podkat2=$3 [L,QSA]


Varianta 2:

RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !^(.*)-([0-9]*)\.html$
RewriteRule ^(.+[^/])$ /$1/ [R=301,L]

RewriteRule ^(.*)-([0-9]*)\.html$ /nazev.php?id=$2 [L,QSA]

RewriteRule ^katalog-(.[^/]*)/$ /katalog.php?kat=$1 [L,QSA]
RewriteRule ^katalog-(.[^/]*)/(.[^/]*)/$ /katalog2.php?kat=$1&podkat=$2 [L,QSA]
RewriteRule ^katalog-(.[^/]*)/(.[^/]*)/(.[^/]*)/$ /katalog2.php?kat=$1&podkat=$2&podkat2=$3 [L,QSA]


Varianta 1 schroustne jen znaky "a-z" u katalogů a Varianta 2 schroustne u katalogů všechny znaky krom "/". Další věc je, že by možná stálo zato upravit pravidlo ^(.*)-([0-9]*)\.html$ protože při tomto pravidlu projde klidně třeba :

www.example.com/sdf%3C%3E*$××÷¤ß$s-df/sd+fs/dfs/df-123.html


což asi neni uplně ideální.

Navíc sem ti do obou variant dal pravidlo pro přesměrování adresi bez lomítka na adresu s lomítkem s kódem 301. Doufám, že ted už ti to bude fungovat. :)
Prkny
Profil
Beta Cam jsi machr ....
tet nemam moznost vse otestovat ... ale vypada to opravdu super...

s tou adresou s html mas pravdu ... zkusim to osefovat v souboru nazev.php
Prkny
Profil
funguje to naprosto dokonale ... az na jednu chybicku ...
pokud zaradim vetu na pridavani / (teda myslim ze to je veta na pridavani lomitek)
RewriteRule ^(.+[^/])$ /$1/ [R=301,L]

je problem s pravidlem RewriteRule ^(.*)-([0-9]*)\.html$ /nazev.php?id=$2 [L,QSA]
jelikoz me presmeruje na neco jako www.domena.cz/nazev-zbozi-723.html/index.php/index.php/index.php/
BetaCam
Profil
Prkny
/nazev-zbozi-723.html/index.php/index.php/index.php/

Pokud používáš rewrite měl by si v aplikaci používat absolutní adresování!!! Ten naskakující index.php je jasná známka toho, že klikáš na odkaz který je v aplikaci naspán relativně.

je problem s pravidlem RewriteRule ^(.*)-([0-9]*)\.html$ /nazev.php?id=$2 [L,QSA]

Není. Pravidlo je v pořádku pro případ který si zde uvedl.

jelikoz me presmeruje na neco jako

No to s velkou pravděpodobností ne. To pravidlo pouze podstrkává nikam nic nepřesměrovává.

www.domena.cz/nazev-zbozi-723.html/index.php/index.php/index.php/

Jak sem řekl pravděpodobně tam máš někde relativní adresování.

ohledně doplnování lomítek koukám, že minule sem tam zapoměl dát parametr NE, ale to na funkci ve většině případů nemá vliv :

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !^(/css/|/images/|/([a-zA-Z0-9-]*)\.html$)
RewriteRule ^(.+[^/])$ /$1/ [R=301,L,NE]


pokud používáš doplňování lomítek nezapomeň že musíš také nastavit pravidlo kam se lomítka nemaj doplňovat.
Pokud to vemu po řádcích tak :

1. Ochrana proti zacyklení

2. Pokud REQUEST_URI začíná na /css/ nebo /images/ nebo začíná na / a libovolný počet alfanumerických znaků nebo pomlček a končí na .html nepřidávej nakonec lomítko ve všech ostatních případech pridej lomítko

3. Redirect s kódem 301 na varianu s lomítkem

Pokud se doplňují lomítka nikdy se nesmí zapomenout vyřadit z doplňování věci do kterých lomítka nepatří. Já téměř v 99.99% případů vyřazuju adresář /images /js a /css další věci pak už záleží na situaci.

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: