Autor Zpráva
technik
Profil
Vím, už se to tu řešilo bezpočtukrát. .htaccess soubor je pro mě španělská vesnice a proto si nevím s úpravami Vašich příkladů rady.

Potřeboval bych něco podobného:
* adresy index.php?proměnná1=hodnota&proměnná2=hodnota2 převést na www.adresa.cz/id_clanku-nazev-clanku
* to aby se mi v případě že otevřu www.adresa.cz/adresar otevřela složka s adresářem a né článek

a ještě jedno. Nevím zda to jde v .htaccess udělat > zakázat prohledávacím robotům "chodit" do adresáře /adresar v rootu.

Díky T.
technik
Profil
V souboru mám zatím jen:

ErrorDocument 404 adresar/data/error404.html
ErrorDocument 403 adresar/data/error403.html
# deny from IP_ADRESA_DOPLNIT
RewriteRule ^index\.php$ /$1 [R=301]
Radim24
Profil
Já se taky brzo chystám na hezké url, tak bych se přidal do diskuse. Ptal jsem se někoho, kdo tomu rozumí (ale je to už delší doba) a zjistil jsem, že to není jen o tom samotném přejmenování. Pokud se chystáte programovat nový web tak jako já, tak asi by bylo dobré se zamyslet nad tím jaké informace chcete předávat na tom webu celkově a celkově jak by měl web fungovat. Když tak mě klidně poupravte pokud se pletu, ale k čemu jsem teda došel já.

Udělal bych nějaké pravidlo, které mi převede nějakou adresu, např. ve formátu:

domena.cz/sekce/znacka/zbozi/druh/nazev-produktu/akce
popř.
domena.cz/sekce/znacka/zbozi/druh/nazev-produktu/akce.php?id=cislo_produktu
na
domena.cz/index.php?a=akce&sec=sekce&zn=znacka&zb=zbozi&dr=druh&na=nazev&id=cislo_produktu

php script pak pracuje s tím posledním formátem adresy. Není nutné, aby to převádělo přímo na ty zkratky. Je ale ještě nutné počítat s absolutním odkazováním na scripty .js a na stylopisy, obrázky, fotky, audio a video.

A teď si nejsem jistý, ale myslím, že by se do pravidla měla uvést nějaká vyjímka, že pokud tam bude něco jako:
domena.cz/images
domena.cz/videos
domena.cz/audio
domena.cz/scripty
tak aby se adresa neměnila. Nebo jak to udělat, aby zůstala cesta k multimediálním souborům, stylopisům a js bez změny?
SwimX
Profil
Já používám toto:
# zakázání listování diru
Options -Indexes

ErrorDocument 403 /shop/index.php?xxx=forbiden
ErrorDocument 404 /shop/index.php?xxx=stranka-nenalezena
RewriteEngine On

RewriteBase /shop/

#přesměrování na verzi s www
Options +FollowSymlinks
RewriteCond %{HTTP_HOST} ^pra.sps-pi.com
RewriteRule (.*) http://www.pra.sps-pi.com/shop/$1 [R=301,QSA,L]

#aby nahrazoval jen neexistující soubory a složky
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

#to co nemá nakonci lomítko ho mít bude :)
RewriteCond %{REQUEST_URI} !^(.*)/$
RewriteRule ^(.*)$ http://www.pra.sps-pi.com/shop/$1/ [L,R=301]

#aby nahrazoval jen neexistující soubory a složky
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

#cokoli za / přepíše do proměnné xxx 
RewriteRule ^((.+)+/?)*$ index.php?xxx=$2 [L,QSA]

<FilesMatch "\.(php|html?)$">

AddDefaultCharset utf-8

</FilesMatch>


pak mám v proměnné $_GET['xxx'] např: elektronika/pocitace/acer/blabla-46/
na záčátku index.php se zavolá funkce uloz_rozeber($_GET['xxx']);
která projde proměnnou, a vytvoří pole dir1 až dirn podle lomítek.

Ve skriptech tedy pracuji s proměnnými $url['dir1'], což je první část URL v tomto případě elektronika.

Nikdy jsem nezapsal problém, a velmi mi to vyhovuje.
Radim24
Profil
SwimX:
Aha, takže vlastně je zbytečné psát něco jako ?bla=bla&pom=pom,
stačí něco jako ?arg=asd/asd/asd/asd/asd/asd/
Ale to musíš přesně vědět, co který parametr v přesném pořadí znamená...
Nebylo by ale lepší a spolehlivější to udělat jako takto:

domena.cz/index.php&a=akce&sec=sekce&zn=znacka&zb=zbozi&dr=druh&na=nazev&id=cislo_produktu

a pak by se třeba vytvořilo pole:
$pole['a']
$pole['sec']
$pole['zn']
atd,

Nebo to nadefinovat do konstant.... pomocí define() Co?

A prosímtě, ještě mi vysvětli tohle pravidlo, zdá se mi to jakési složité a nechápu proč to tam je:
((.+)+/?)*
SwimX
Profil
Radim24:
spolehlivější? to nevím, záleží to na tobě.
Já to dělám takle:
1. pokud neexistuje proměnná dir1 ($url['dir1']) přesměruju na /halvni-strana/
2. mám logicky url, tedy první parametr dir1 mi určuje o co se jedná (produkty, clanky, hlavni-strana, administrace)
3. includuju příslušný soubor
switc($url['dir1']) {case "hlavni-strana": include "pages/uvod.php"; break; ....... 


takže pokud mám eshop a nahoře je: obchodní podmínky. To je článek uložený v DB v tabulce články, tak odkaz na to bude:
/clanky/obchodni-podminky/

naincluduje se soubor clanky, ve kterém už je napsáno: SELECT FROM table blááá a vypíše mi na obrazovku znění články, který se menuje obchodni-podminky

Myslím si, že je to univerzálnější než v htaccesuu mít ?sekce=clanky&url=obchodni-podminky
protože třeba u produktů, bude první parametr dir1 kategorie, dir2 podkategorie, dir3 teprve produkt. > podle dir 1 naincluduju příslušný soubor a pak už očekávám správně seřazená url (pokud nejsou > include pages/notfound.php s errorem)

((.+)+/?)* to znamená>
(.+) cokoli ale aspoň jeden znak
(.+)+ alespoň jednou
/? lomítko být může a nemusí
((.+)+/?)* a to celé několikrát, i nulakrát

Asi by to šlo napsat jednodušeji, ale je to htaccess který použivám už x let, kdysi jsem to vymyslel takle, tak to tak zůstalo :))


Snad to pomůže
Radim24
Profil
Asi jsme si trochu neporozuměli.

V htaccesu určitě nebude nic jako
?sekce=clanky&url=obchodni-podminky
To ne! Hlavní je dostat to nějak jako jeden řetězec za index.php. Ale to už je v podstatě proměnná, takže bych použil tu tvou formuli nebo něco podobného

#cokoli za / přepíše do proměnné xxx 
RewriteRule ^((.+)+/?)*$ index.php?xxx=$2 [L,QSA]


Mě šlo jen o ten formát toho zápisu pro soubor .php tedy
a) /asa/sf/asfd/fasf -- tvoje řešení
b) &a=as&b=as&c=as&d=as

Ale toho tvého způsobu mi přijde blbé, že bych si nemusel pamatovat co vlastně zpracovává
$url['dir1'], takže bych to spíše pojmenoval $url['akce']. Jinak mě teda ještě napadlo použít místo pole konstanty. Výhodu to má v tom, že se to snadněji píše. Vlastně jsem nikdy konstanty nepoužíval, ale nejspíš začnu. Akorád nevím jestli je nutné je deklarovat do funkcí jako global nebo to nepotřebují (a to by bylo velké plus!).
Chamurappi
Profil
Vidím tu spoustu textu, ale nevšiml jsem si, že by někdo řešil trojici dotazů technika.


Reaguji na Radima24:
Já se taky brzo chystám na hezké url, tak bych se přidal do diskuse.
S naprosto nesouvisejícím dotazem. Takhle bys mohl vpadnout do půlky vláken v příslušné kategorii. Je to přinejmenším drzé. Až budete ty nebo SwimX psát další příspěvek, založte jím nové vlákno a já (nebo někdo z kolegů) tam zdejší dialog přesunu (příspěvky se řadí podle času, takže se dostane před ten zakládající).
Radim24
Profil
Ten první příspěvek byl určený technikovi . Chtěl jsem mu pomoct tu záležitost nejdříve pochopit z principového hlediska, než se pustí do tvorby těch pravidel.

Odpověď ale už dostal v příspěvku od SwimX, ale asi by to měl někdo přepsat, aby to sedělo technikovi. Ja bych jen upravil tu linu od SwimX:

#aby nahrazoval jen neexistující soubory a složky
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^((.+)+/?)*$ index.php?xxx=$2 [L,QSA]  #cokoli za / přepíše do proměnné xxx 


Ale netestoval jsem to.

Pak už je to jen záležitost PHPčka, jak si ten řetězec rozparsuje.

To popisoval SwimX:

"pak mám v proměnné $_GET['xxx'] např: elektronika/pocitace/acer/blabla-46/
na záčátku index.php se zavolá funkce uloz_rozeber($_GET['xxx']); "
technik
Profil
Děkuji za rady, snad to nějak zužitkuju.

T.
Teofil
Profil *
Ahoj. Mám problém s nastavením pěkných adres. Potřebuji u jednoduchého webu, kde jsou všeho všudy 4 podstránky s koncovkou .php vytvořit tvar bez toho ".php".
Vložil jsem si do .htaccessu tento kód podle vašich rad:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule .* - [L]
RewriteRule ^([\w-]+)$ /$1.php [L,QSA]
Jedná se opravdu jen o několik málo stránek bez nějakých "komplikací" typu ID článku atd, a přesto mi to nejede. Na serveru je Mod_rewrite povolen. Zkoušel jsem i napsat jednotlivé stránky do jednotlivých řádků. ale taky nic. Prostě chci, abych mohl zadat tvar mujweb.cz/kontakt a ne mujweb.cz/kontakt.php. Toť vše. Poradí někdo?
Omlouvám se všem znalcům. Jsem v tomto směru asi lama ;-)
Davex
Profil
Zkus to takhle: Řešení některých častějších problémů (FAQ) » Stránky s adresou bez přípony

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0