Hezké URL

Dělám si blog, a chtěl bych na něm mít "hezké URL" (každý asi ví co to znamená) (adresa.cz/clanky/vitejte-na-blogu), ale nevím pořádně jak to udělat. Z článku na interval.cz jsem to nepochopil :-( Neví někdo, co napsat do .htacces, a co do stránky, když bych to chtěl ve tvaru

adresa.cz/clanky/nadpis-clanku

Děkuji moc :-)
Jednotlivé články jsou samozřejmě uložené v databázi MySQL, a nyní to mám na stránkách v tomto tvaru

adresa.cz/index.php?stranka=clanky&id=1

a chtěl bych to na

adresa.cz/clanky/nadpis-clanku

Snad jsem to vysvětlil dobře :-)
jen by mě zajímalo, jak si představuješ, že uděláš pomocí mod_rewrite z "1" => "nadpis-clanku" ?

nelze. (teda lze, ale natolik komplikovaně, že budeš mít z .htaccess telefonní seznam :-) nejdříve si adresy, aby vypadaly nějak takto :

neco.cz/?stranka=clanky&jmeno=pekny-nazev-clanku

pak už není sebemenší problém.
pokud jsou uloženy v db, nehlede pomoci id:

adresa.cz/index.php?stranka=clanky&id=1

ale podle nazvu:

adresa.cz/index.php?stranka=clanky&nazev=ja-sem-ubah-admin

a pak už to je hračka:

http://mike.webzdarma.cz/mod_rewrite-a-hezke-url/
http://mike.webzdarma.cz/mod_rewrite-a-hezke-url-dil-ii/
http://mike.webzdarma.cz/mod_rewrite-a-hezke-url-dil-iii/
<HTML>Problem ale vetsinou neni prepsat URL...
Problem je spis s tim pracovat...
Tohle: neco.cz/?stranka=clanky&jmeno=pekny-nazev-clanku
je velmi specificke, neumoznuje to zadne zanoreni a hodi se to spis do malych webu kde to dal nevede (tedy mysleno co se tohoto zpusobu vuci strukture tyce)

Pokud ale mame neco jako je napr. na stahuj.cz:
ADRESA/internet_a_site/prohlizece_a_rozsireni/ostatni/safari/nahledy/
a predem nevime kolik podkategorii muze byt a ktery z parametru je "clanek" SAFARI a ktera je jeho "podkategorie" nastava uz slozitejsi orisek.. predevsim musime pocitat s tim, ze to potom cele az ke koreni budeme zobrazovat v drobeckove navigaci.
Tohle treba mike tusim ve svem clanku neresi, ale jsem zvedav jak by takovou situaci resil treba prave on.</HTML>
U mě se jedná o weblog, kde bude URL ve tvaru

neco.cz/clanky/nazev-clanku

Už jsem něco zkoušel na localhostu, podle návodu jsem si povoli mod_rewrite (odkomentářování těch 2 řádků...). Do .htaccess (která je ve složce "clanky") jsem dal:

RewriteEngine on
RewriteRule ^([a-zA-Z0-9\\-]*)$ /clanky/index\.php?id=$1 [L,NC]

A do indexu ve složce "clanky"?

$d = mysql_query("select * from nw_clanky where zkratka='".$1."'");
$v = mysql_fetch_array($d);

( samozřejmě i výpis a tak...). Když ale zadám adresu

localhost/neco.cz/clanky/muj-prvni-clanek

tak mi to hodí 404, že byl adresář clanky/muj-prvni-clanek nenalezen. Ve slupci "zkratka" v MySQL mám uložené to, co se dává do adresy (teda v tomto případě "muj-prvni-clanek". Nevíte co s tím?
tak si zapni rewrit_log a podívej se, co že je špatně...
A ten zapnu jak? :-)
http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html

doporučuji level 9
Tak teď už to vůbec nechápu :-( Udělal jsem všechno přesně podle tohodle návodu:

http://programujte.com/index.php?akce=clanek&cl=2006091901-prakticka-ukazka-zakladniho-pouziti-mod_rewrite-pro-seo-adresy

A stejně mi to nejde, a hazí to pořád 404 :-(
» Pavel :
mluvíš o jedné věci, a uvádíš jinou... v RewriteRule máš id, v sql dotazu nějakou proměnnou 1 (navíc ani jako $_GET) , máš tam pochybnou absolutní adresu, roztodivnej regularni vyraz... :-D

co takhle vzít to popořadě :

1) příklad škaredý adresy: www.neco.cz/?stranka=clanky&jmeno=nazev-clanku

2) příklad hezký adresy : www.neco.cz/clanky/jmeno=nazev-clanku/

3) inkludování : podle $_GET['stranka'] nainkluduješ.

4) SQL dotaz : vybereš podle $_GET['jmeno'] (sloupec, kam se ukládá 'peknej-nazev' by mohl být unikátní)
$query = mysql_query("SELECT * FROM `clanky` WHERE `zkratka` = '".$_GET['jmeno']."');

5) mod_rewrite (pro obě proměnný)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([A-Za-z0-9-_]+)/?$ ?stranka=$1

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([A-Za-z0-9-_]+)/([A-Za-z0-9-_]+)?/?$ ?stranka=$1&jmeno=$2

nějak takto třeba? ;-)
omlouvám se, chtěl jsem říct :

*2) příklad hezký adresy : www.neco.cz/clanky/nazev-clanku/
<HTML>>> Do .htaccess (která je ve složce "clanky") jsem dal:
>> RewriteEngine on
>> RewriteRule ^([a-zA-Z0-9\\-]*)$ /clanky/index\.php?id=$1 [L,NC]


bylo by dobre, kdybys taky vedel cos tam dal :)

"^([a-zA-Z0-9\\-]*)$" - spatne
"/clanky/index\.php?id=$1" - spatne
"[NC] " - zbytecne</HTML>
<HTML>Mike neschovavej se ;)</HTML>
2 Richard: Když to mám špatně, co by jsem tam teda měl napsat?
» Pavel :
nejdříve bych si rád ujasnil jednu věc - máš tam nějaké includování podle proměnné v GETu? protože pokud ano, proč nemáš ten .htaccess v kořenovém adresáři? pokud ne, dej ho do kořenového adresáře a soubor "clanky" includuj podle GETu :)

proč také nezkusíš to, co jsem ti radil?

» Richard :
cože? já se neschovávám :-)
I když postupuju přesně podle návodu od Mike, pořád mi to háže, že adresář nenalezen :-( Nebude to třeba tím, že mám špatně povolený mod_rewrite? Jak to mám správně na localhostu udělat?
To samý mi to ale dělá, když to nahraju na WZ :-( Includování mám dělaný:

<?php
if ($stranka) {
include ($stranka.".php");
} else {
include ("novinky.php");
}
?>

takže adresa vypadá například
adresa.cz/index.php?stranka=clanky
(ten soubor clanky.php mám v kořenovém adresáři), a v tom clanky.php to vybírám takto:

$d = mysql_query("select * from nw_clanky where id='".$id."'");
$v = mysql_fetch_array($d);

To už jsem sice psal, ale ještě jednou pro jistotu. Už fakt nevím čím to může být... :-(
1) neincluduj soubory v kořenovém adresáři. zkus si tohle a pochopíš proč /index.php?stranka=index

2) nevybírej z databáze podle ID (což už jsem mimochodem psal), ale podle toho, co jsem radil : 19. 12. 2007 19:37 ad 4) Takže nějaký další sloupec v tabulce, kde bude uloženo "pekny-nazev-clanku" potom použij mod_rewrite ad 5) (jinak složka se stejným názvem jako inkludovaný soubor nesmí existovat)

2.1) where id='".$id."'"); není nejšikovnější - raději používej where id='".$_GET['id']."'"); když už...

3) mod_rewrite buťo povolit lze, nebo ne :) nevím sice, co máš doma nainstalovaný, ale například v triádě najdeš soubor /conf/httpd.conf, a v něm řádek "LoadModule rewrite_module modules/mod_rewrite.so" který nesmí začínat mřížkou.

jinak pokud se nemýlím, tak stačí napsat do .htaccessu RewriteEngine On, a hned víš, zda-li mod_rewrite funguje nebo ne :-)
Oki. Takže jsem přejmenoval složku clanky, ale teď mi to hází chybu 500

Internal Server Error

Nevíš proč?
vím :) 500 ti pravděpodobně vyskočilo proto, že máš v .htaccessu nějakej nesmysl. můžeš ho buďto opravit, nebo sem postnout obsah .htaccessu a pokusili bysme se ti ho opravit my :)
Mám tam tohle:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([A-Za-z0-9-_]+)/?$ ?stranka=$1

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([A-Za-z0-9-_]+)/([A-Za-z0-9-_]+)?/?$ ?stranka=$1&zkratka=$2

A ten .htaccess je v kořenovém adresáři. Když napíšu třeba

adresa.cz/clanky

tak se mě ten soubor clanky.php zonrazí, ale neinkluduje se do indexu. Pokud zadám ale

adresa.cz/clanky/clanek-s-hezkou-url

hodí to 500
netuším, v čem máš chybu. ale bude snad někde jinde, než uvádíš. .htaccess je v pořádku (kdyby nebyl, vyhodí to chybu 500 kdekoli)

udělal jsem si 2 testovací skripty, a fungují bez problémů : index.php v rootu :

<?php
if (isset($_GET['stranka']) && $_GET['stranka'] == 'clanky') {
include './slozka/clanky.php';
}
?>

clanky.php :

<?php
require "./config.php"; # tady mám připojení k db a vše potřebné

if ( isset($_GET['zkratka']) ) {
$vypis = mysql_fetch_array(mysql_query("SELECT * FROM `e_clanky` WHERE `permalink`='".addslashes($_GET['zkratka'])."'"));
echo $vypis['jméno'];
}
?>

e_clanky je moje tabulka, kde mám zrovna něco uloženýho, sloupec permalink je obdoba tvého zkratka.

soubor volám http://localhost/clanky/vitejte/ a vypíše "Vítejte" - přesně to, co má.

takže chybu hledej jinde :-)
Tak teď už teda fakt nevím, ani tohle mi nejde. Zkoušel jsi to na localhostu nebo někde na internetu. Možná bude nejlepší, když ty svoje soubory někde nahraju, aby ses na ně podíval sám ne?
Pavel : asi ano, to bude asi opravdu nejlepší :)

zkouším na localu : Apache2triad 1.5.4 : Apache 2.2.0 (Win32), PHP 5.1.2, MySQL 5.0.18