mod_rewrite a hezké url
Často vyhledávané slovní spojení na internetu - "Jak na hezké url?" Vyhledávače Vám najdou spoustu hesel, ale jak dojít k opravdu funkčnímu řešení? Sám jsem odpovědi na tohle téma mnohokrát vyhledával, ale málokdy jsem našel skutečné řešení. Odpovědi se mi vždy dostalo až na diskusních fórech: diskuse.jakpsatweb.cz, jaknaweb.com, webzdarma.cz/forum Většina článků se totiž věnuje buď základní syntaxi .htaccessu, nebo 100x omílanému tématu vlastních chybovek.
Komentáře k článku:
pricom sa do indexu includuje (include) subor z adresara ./novinky/index.php
v tomto pripade ide vsetko v poriadku ale ako dam aby to islo cez .htaccess tak sa to uplne pokazi :(napr. http://darksea-web.x4um.net/novinky/obsah .htaccess:
RewriteEngine On
RewriteRule ^index.php$ http://darksea-web.x4um.net/$1 [R=301]RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ ?page=$1
dívál jsem se na web, a tuším, v čem je problém, ale už si nejsem jisté jeho řešením..adresa ?page=novinky je samozřejmně v pořádku, ale
/novinky/ už ne - ano, problém bude ve špatném includování. jestli máte pro každou proměnnou adresář, ve kterém je index, taka) hezké url ztrácí výzam
b) fungovat to samozřejmně nebudezákladní princip je ten, že jméno souboru povýšíte na složku. složka ale nesmí existovat. klasické includování se většinou řeší tak, že si všechny soubory *.php uložíte do jedné složky, a zní je pak načítáte. toto je asi nejjednodušší zápis:$filename = $page . '.php'; if ($page=="") { include ("./includes/main.php"); }
elseif (File_Exists ("./includes/$filename")) { include ("./includes/$filename"); }
else { include("./includes/404.php"); }všechny soubory mám ve složce includes, z ní je pak načítám, a pomocí mod_rewrite "povýším" na složkupokud jsem to tedy pochopil správě ;-)
skusal som ako si to povedal ty ze
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)?/?$ /index.php?stranka=profil&id=$2
a taktiez aj takto
RewriteRule ^vsetcia/profil/(.*)/$ /index.php?stranka=vsetcia&id=$1
No nechce to ist?
Nevies preco? Velmi by mi to pomohlo.
Dakujem
a potom ziskavam id ako $id=$_GET['id'];
lenze nechce ho ziskat.
adresa je takato: stranka.sk/vsetcia/34
Nevies kde moze byt problem?
dakujem
/vsetcia/$vsetciaf['id']
nic moc, ale lepší, než kdyby mi to znefunkčnilo druhou proměnnou... :)
RewriteRule vsetcia/([^/]+)?/?$ /index.php?stranka=vsetcia&id=$1
Ale ani to neviem ako spravit :(
jak jsou stránky dělané - includování / výpis s db / nebo třeba jen blbý if | echo :)
vidět webzkus prostě použít ten přepis, co jsem ti tu napsal (k tomu i tu verzi pro jednu $) a změň si akorát podle toho generování odkazů :)
$page=$_GET['stranka'];
if (!$page) {$page='uvod';}
switch ($page) {
case 'uvod':
include 'uvod.php';
break;
case 'kontakt':
include 'kontakt.html';
break;
a tak dalej....
skusil som co si napisal, no este stale to nepredava premennu $id :(
takže vytáhneš id uživatele z db, a vypíšeš jeho profil, ne?pokud to tedy funguje bez mod rewrite, a s pěknou verzí uri ne, tak už ti asi ale neporadím... ty přepisy by měly fungovat nezávisle na tom, co zrovna vypisuješ / includuješ, a v nejhorším přípaedě budeš mít:a) jednu stránku se škareodu url,
b) můžeš použít něco jakohttp://neco.sk/profil/?id=55
http://neco.sk/profil/&id=55(teď už nevím, co z toho funguje...)třeba jak jsem tohle vyřešil já - zase trochu jiný příklad - mám fotogalerii s pěknýma url, u každé sekce lze vkládat comment. je tam link něco jako zobrazit formulář, kdy pod podmínkou naincluduju commentform - jenže tam mi hezké url už nefungovaly, takže výsledek ja nějaký takový:http://neco.cz/Prazdniny.html => zobrazíš form =>
http://neco.cz/?page=Prazdniny&action=pridej =>a až komentář odešleš, je tam header zase na pěknou verzi url. je to sice něco jiného než je tvůj problém, ale píšu to proto, že je to také možnost a možná tě také něco napadne
a bude, aj tak to ma len administrator, takze ludia to vidiet nebudu :)
Diky moc :)
potreboval by som vediet, ako upravit htaccess v mohom pripade.. na link http://www.podstromami.com/index.php?&arow=1 nefunguje nic.
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ ?arow=$1poslední řádek můžeš zapsat i takto:
RewriteRule ^([^/]+)/?$ index.php?arow=$1
Dik.
<a href="/portfolio_info/<? echo $zaznam[id]?>">info</a>.htaccess:
#tomkorp.org/?page=neco > tomkorp.org/neco/
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ ?page=$1#tomkorp.org/?page=neco&stranka=druha > tomkorp.org/neco/druha
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)?/?$ ?page=portfolio_info&id=$2
Díky moc.PS.: Na tvích příkladech sem konečně pochopil jak mod_rewrite funguje ;-)
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ ?page=$1 a do rss.php jsem vložil<a href="/rss/"></a> a http://kindl-martin.unas.cz/rss se mi nezobrazilo. Co jsem asi udělal špatně? :)
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-fa http://kindl-martin.unas.cz/rss soubor nenalezen, soubory mam na 777.
RewriteEngine On
# nejdříve zapneme mod_rewriteRewriteBase /
# jako druhý krok nastavíme základnu (Base)# zde bude vždy soubor podmínek (Cond) ukončených pravidlem přepisu# pokud jsou podmínky splněny, aplikujeme pravidlo (Rule)
RewriteCond %{REQUEST_FILENAME} !-d
takhle to funguje %5 tudíž správný zápis je : doporučuji přečíst si i nějaké další články na danou tematiku.RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^rss/$ rss.php
jakykoli-soubor.php => /jakykoli-soubor/
včetně automatického přidání lomítka na konec %0
se svými stránkami sídlím na jednom nejmenovaném hostingu a mám pro ně zřízený doménový alias, chci ale aby tento alias vracel jiný obsah
použil jsem váš příklad # subdomena foto.mujweb.cz
chci aby neco.cz vracelo neco.cz
a aby alias.cz vracel obsah neco.cz/druhaRewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} alias.cz
RewriteCond %{REQUEST_URI} !druha/
RewriteRule ^(.*)$ druha/$1uvedená formule funguje, ale chtěl bych si být jistý od někoho zkušeného protože ty řádky moc nechápu,vysvětlení také uvítám
děkuji předem
RewriteCond %{HTTP_HOST} alias.cz # první podmínka, jaká url se bude přepisovat
RewriteCond %{REQUEST_URI} !druha/ # negace, v druhé podmínce zkontrolujeme, zda-li není v adrese jméno daného adresáře
RewriteRule ^(.*)$ druha/$1 # první část je regulární výraz, takže vše ve složce druha podstrčíme dané adrese, pokud jsou obě podmínky splněny.řádek by šel názorně zapsat pomocí funkce ereg_replace() :ereg_replace("^(.*)$", "druha/1", $arg)doufám, že je to to, co jste chtěl slyšet %0
chtěl bych se zeptat, jak udělat toto:zadám www.example.com/soubor.php a podstrčí se www.example.com/slozka/soubor.php(Např. v složce clanky mám soubor o-velrybach.php, ale nechci, aby byla v adrese vidět ta složka clanky.)Děkuju za radu.
RewriteRule ^([^/]+).php /slozka/$1.php [L]přepis by ti měl vzít všechno, včetně DirectoryIndexu a chybovek. .htaccess musí být samozřejmě v kořenovém adresáři.
Díky
A jak je u mě naprosto normální, hodilo to chybu - 404 Not Found (při klepnutí na odkaz).Proto bych prosil o radu. Je chyba
RewriteEngine On
RewriteCond %{HTTP_HOST} ^new.picky-design.com$
RewriteRule ^(.*)$ http://www.new.picky-design.com/$1 [R=301]
RewriteRule ^index.php$ http://www.new.picky-design.com/$1 [R=301]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)?/?$ ?str=$1&sl=$2
background-image:url(/img/img.jpg);
/sk/ , pro což by pravidlo vypadalo nějak takto :
v článku píšeš toto řešení:# mujweb.cz/index.php > mujweb.cz/
RewriteEngine On
RewriteRule ^index.php$ http://mujweb.cz/$1 [R=301]Zajímalo by mě, zda je možné udělat toto nějak jednoduše s každým adresářem, nejen tím kořenovým.Tak napřiklad:mujweb.cz/slozka/index.php > mujweb.cz/slozka/Děkuju Ti za radu.
Konkrétně:
do prohlížeče napíšu: www.ananta.cz
zobratí se: http://www.andele.info/pur/...
chtěl bych zobrazit: http://www.ananta.cz/...
Děkuji za pomoc.
#redir pro domenu ananta.cz
RewriteCond %{HTTP_HOST} ^www.ananta.cz$ [NC,OR]
RewriteCond %{HTTP_HOST} ^ananta.cz$ [NC]
RewriteCond %{REQUEST_URI} !^/test/
RewriteRule ^(.*) /test/$1 [L,QSA]
avsak ked som v menu zmenil odkaz |a href='''?page=nieco' | na |a href='''/nieco/' | tak ma to hodilo do root cize http://localhost/niecoa aj ked som zmenil RewriteBase / na RewriteBase /nazov_stranky/ tak to nepomohlo.. stale ten odkaz hadzalo na root
Na stránke mam odkazy typu www.niečo.sk/?page=1,2,3 ..., ktoré sa mi pekne prehodia na ../1,2,3,.../
Ale pre stránku ./3/ potrebujem spraviť podstránky v ktorej na webe sú cez odkaz www.niečo.sk/?page=3&id=sub1,sub2,sub3,... no tu mi to už nehodí to pekné url. Musím to zadať priamo do odkazu sám v tom prípade to ide. Ja by som ale bol račej keby to prehodilo ako pri prvej úrovni.A taktiež pri tomto mi po dopísaní za www.niečo.sk/1/blbost.html zobrazí stránku www.niečo.sk/1/ namiesto chyby 404.A nejak sa s týmto mojím problémom neviem pohnúť.riešim to aj tu -> http://diskuse.jakpsatweb.cz/?action=vthread&forum=3&-;topic=117458 tam je aj php script čo používam na generovanie stránok v prvej úrovni. Pre druhú to síce mám ale neviem či dobre. No najprv potrebujem vyriešiť toto.Vopred dík
$page=$_GET['page']; if (!$page) {$page='test1';} switch ($page)
{
case 'test1':
$title='test1';
$nadpis='TEST1';
$active1=' style="font-weight: bold;" ';
$include='test1.php';
break;
case 'test2':
$title='test2';
$nadpis='TEST2';
$active2=' style="font-weight: bold;" ';
$include='test2.php';
break;
case 'test3':
$title='test3';
$nadpis='TEST3';
$active3=' style="font-weight: bold;" ';
$include='test3.php';
break;
default:
$title='404';
-$nadpis='CHYBA 404';
$include='404.php';
header('HTTP/1.0 404 not found');
break;
}
?>
---------
<?php include 'script.php'; ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="generator" content="PSPad editor, www.pspad.com">;
<title>Test stránka - <? echo $title; ?></title>
</head>
<body>
<h1><? echo $nadpis; ?></h1>
<br />
<a href="/?page=test1"<? echo $active1; ?>>Test 1</a>
<a href="/?page=test2"<? echo $active2; ?>>Test 2</a>
<a href="/?page=test3"<? echo $active3; ?>>Test 3</a>
<br /><br /> <br />
<div style="width:300px;height:600px;border:1px solid;">
<?php include $include; ?>
</div>
</body>
</html>
rewritovaná adresa: ./stranka/podstranka/id/Přes ukázku kódu, který jsem ti psal z toho uděláš ty 3 proměnné.$_GET['path'][0] bude "stranka"
$_GET['path'][1] bude "podstranka"
$_GET['path'][2] bude "id"at tak dále.
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)/$ /?rw=1 [L,QSA]$path = explode('/', preg_replace('/\/$/', '', $_GET['path']));
$rw = $path[0];
$page = $path[1];
$id = $path[2];A stále Internal Server Error.Asi ma už zabiješ :)p.s.:čo sa týka toho generovanie tak to som si stiahol a sa na to pozriem, vyzerá to dobre.
$path = explode('/', preg_replace('/\/$/', '', $_GET['path']));
$rw = $path[0];
$page = $path[1];
$id = $path[2];
nemám dať do .htaccess ale asi do toho script-u php.Len zatiaľ som neprišiel na to kde.
No hlavne je to elegantnejší spôsob ako generovať stránky :).Dík za tvoju trpezlivosť a snahu mi pomôcť!!!!
RewriteEngine On
RewriteRule ^(.*).html /?promenna=$1Jen takovej malinkej(asi hloupej) dotaz. Nemá na 3. řádku místo .html být \.html (zpětné lomítko před tečkou), aby ta tečka nebyla považována za metaznak, ale za normální znak tečka? A jestli ne, tak proč ne, díky :-).
Vdaka!
Mám adresu: http://www.chef06.xf.cz/index.php?page=autor a chci ji změnit na http://www.chef06.xf.cz/autor/v .htaccess mám napsané toto:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ ?page=$1Jednotlivé soubory mám includované následovně a umístěné ve složce /pages/
if ($page == "uvod") { include("pages/uvod.php"); }
elseif ($page == "autor") { include("pages/autor.php"); }
elseif ($page == "clanky") { include("clanky/clanky.php"); }
elseif ($page == "clankyp2") { include("clanky/clankyp2.php"); }
....... else..Hostuju na wz. Kde mám prosím tě chybu? Díky O.
Problem vznika pokud se snazim prepinat mezi strankami (napr. odkaz /ceniky/toshiba) - vzdycky dostanu 404. ZKousel jsem menit odkazy tak aby ukazovaly na /web/ceniky/toshiba - taky 404..htaccess vypada takto:
Options +FollowSymLinks
RewriteEngine on
Rewritebase /RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ ?cast=$1 [L]RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)?/?$ ?cast=$1&stranka2=$2 [L]i kdyz zmenim rewritebase na /web tak opet dostavam 404. Muzes poradit jak na to? ktera cesta bude nejlepsi aby vse jelo? Pokdu jsi na icq tak to klidne muzem probrat pres nej... dekuju :-)
RewriteRule ^page/([^/\.]+)/?$ index.php?page=$1 [L]at uz v nem prepisuji a nazyvam cokoli jakkoli, mi nefungujeNejde mi ani zprovoznit to co jste popisoval na zacatku tohoto tematu.Muj pripad je klasicky:
http://www.example.com/clanek?clanek_id=1
chtel bych
http://www.example.com/1-nadpis-clankuRewriteRule ^stranka/?$ /index.php?page=stranka [L,QSA]
normalne funguje, vyznam [L] atd chapu.Dekuji kazde dobre dusi, ktera by me navedla spravnym smerem.
Tom
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?page=$1 [L]problém ale asi nebude v mod_rewrite ale ve struktuře dat. pokud chceš v url www.neco.cz/napis-clanku/, pak musí být řetězec "nadpis-clanku" uložený v databázi. při ukládání si samozřejmě musíš ošetřit, aby 2 články nemohly mít stejnou URL. to IDčko tam je naprosto zbytečné - jen dělá z hezkých url o něco méně hezké url.
U me mozna bude problem jinde, a omlouvam se to jsem minule nenapsal. Ten system neni napojeny na databazi, ale ridi se promennymi v jednotlivych souborech. Duvod proc to tak je nechapu, nicmene je to pozadavek. Tzn., ze vlastne formou ruznych if, echo, else, require, ob_start() je to cele provazane. Nerikam ze bych to nechtel udelat jinak, ja jsem system prevzal po predchudci (jeho syn), klient si to nenecha vymluvit, vidi vyhodu v tom, jak se systemem pracuje a nechce slyset o tom ze by se musel ucit jiny zpusob, i kdyz jednodussi, s tim nic neudelam.
Jinymi slovy netusim, co bych mohl udelat aby to bralo ze souboru s id v nazvu (1.php) hodnotu promenne $nadpis. Jedine me napada, ze by system zustal vlastne bezdatabazovy, ale ochcal bych to zapisovanim do db pouze id a prislusneho nadpisu a odtud by se pak tahalo do url, jenze si neumim predstavit tu pakarnu aby se to do db zapsalo pokazdy kdyz tam zakaznik nasadi novej soubor. Jenom uvaha. Kazdopadne jestli vas nekoho napada jak hodnotu $nadpis vytahnout ze souboru s prislusnym id, budu vam vdecny. Moc dekuju, Tom
Header location mi to sice prepise (presmeruje) na nadpis v url, jenze k tomu bych musel pouzit ten zpusob ze vlastne 2 ruzny url vedou na stejny clanek a to se zase nelibo robutkum kvuli duplicitam.
$radky = explode("\r\n", $soubor); rozřežeš obsah podle řádku. vezmeš první řádek $radky[0]tam klasicky přes str_replace odmažeš začátek a konec toho html komentu, tedy zbyde ti jenom "1;Nadpis článku;hezky-nadpis-clanku".a opět přes explode rozbiješ do pole, takže budeš mít vlastně array(1, 'Nadpis článku', 'hezky-nadpis-clanku');
Přidat komentář