Autor Zpráva
Lorin
Profil *
Vím, že to tu již bylo několikrát, hledal jsem jak tady, tak na googlu. Zatím jsem nic relevantního nenašel. (Nejspíš se blbě ptám :)) Můj htaccess vypadá následovně:

RewriteEngine On
RewriteBase /slozka
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ index.php?p=$1&section=$2&id=$3 [NC,L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ index.php?p=$1&section=$2&type=$3&id=$4 [NC,L]

V rámci možností to funguje. Po zadání adresy ve tvaru www.mujweb.cz/slozka/stránka/sekce/ID se stránka načte. Mám ale dva problémy.

1) Odkazy, které mám ve stránce (přímo napsané v PHP souboru) jsou v tom "nehezkém" tvaru: www.mujweb.cz/slozka/index.php?p=stránka&s=sekce&i=id. Když si načtu stránku pomocí "hezké" adresy a pak kliknu na nějaký odkaz, adresa se přepíše tak, že můj odkaz se dosadí místo ID.

Příklad:
www.mujweb.cz/slozka/user/profile/1 => www.mujweb.cz/slozka/user/profile/index.php?p=user&section=profile&id=1

Musím přepsat všechny odkazy v souborech, nebo stačí přidat nějaké další pravidlo a přepis?

2) S ohledem na to, že mám CSS vložené pomocí relativní cesty (relativní k souboru index.php), po zadání "hezké" adresy se kaskádové styly nenačtou. Jde nějak v .htaccess nastavit, aby se "hezká" adresa, kterou používám nepočítala jako adresář? Pokud nebudu počítat možnost, kdy místo "/" dosadím "_" nebo "-".
Davex
Profil
Lorin:
ad 1) Na stránku musíš vypsat odkazy v nové podobě. Žádné pravidlo v tomto nepomůže, protože v pravidlech mod_rewrite se zpracovávají jen adresy, které od serveru požaduje prohlížeč.

ad 2) V odkazech na další soubory používej kořenové adresy.
Lorin
Profil *
Díky za odpověď.

Davex:
ad 2) V odkazech na další soubory používej kořenové adresy.
Co se kořenové adresy týče, myslí se tím od kořene určeného v RewriteBase nebo kořene webu jako takového?


Tak jsem zkusil jen namátkou několik odkazů předělat. Zjistil jsem, že na stránce se vyskytují ještě další typy odkazů.

a) www.mujweb.cz/slozka/stranka
b) www.mujweb.cz/slozka/stranka/sekce
c) www.mujweb.cz/slozka/stranka/sekce/id (Už implementováno)
d) www.mujweb.cz/slozka/stranka/sekce/typ/id (Už implementováno)

První dva typy jsem se pokusil přidat:
RewriteEngine On
RewriteBase /slozka
RewriteRule ^([^/]*)$ index.php?p=$1 [NC,L]
RewriteRule ^([^/]*)/([^/]*) index.php?p=$1&section=$2 [NC,L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ index.php?p=$1&section=$2&id=$3 [NC,L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ index.php?p=$1&section=$2&type=$3&id=$4 [NC,L]

S přidáním prvních dvou přepisů mi ale přestali fungovat ty dva, které jsem tam už měl. A co se týče CSS souboru. I když použiju absolutní adresu, css se nenačte. Schválně jsem si zkusil otevřít zdroják stránky přímo v prohlížeči a kliknout si na adresu (jestli se zobrazí css soubor, je všechno v pořádku a chyba je někde jinde). Adresa mě zavedla na hlavní stránku. Jde o defaultní chování v případě, že se uživatel snaží načíst něco, co neexistuje. Problém bude v tom, že CSS soubor mám uložený ve dvou podadresářích, takže adresa vyhovuje přepisu c). Jde nějak zakázat přepis v případech, kdy odkaz vede na existující soubor?


Update:
Prozatím jsem odstranil první dva přepisy (a,b) a přidal podmínky.

RewriteEngine On
RewriteBase /slozka
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ index.php?p=$1&section=$2&id=$3 [NC,L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ index.php?p=$1&section=$2&type=$3&id=$4 [NC,L]

CSS funguje jak má. Problém je ale s adresami, které vyhovují přepisu "a" a "b"


Ah, tak jsem zjistil že RewriteCond se vztahuje jen na následující jeden přepis. Vše jsem doladil do této podoby:

RewriteEngine On
RewriteBase /wot_guide
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)$ index.php?p=$1 [NC,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/([^/]*)$ index.php?p=$1 [NC,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ index.php?p=$1§ion=$2&id=$3 [NC,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ index.php?p=$1§ion=$2&type=$3&id=$4 [NC,L]

Funguje jak CSS, tak přepis adres, tak původní "nepěkné" adresy.
Davex
Profil
Lorin:
Co se kořenové adresy týče, myslí se tím od kořene určeného v RewriteBase nebo kořene webu jako takového?
Na serveru se zpracovává RewriteBase a přepisovací pravidla nezávisle na tom, co se děje s odkazy v prohlížeči, takže kořenovou adresou v odkaze se rozumí od kořene webu.

Zjistil jsem, že na stránce se vyskytují ještě další typy odkazů.
Co to třeba zjednodušit tak, že se celá adresa předá skriptu a jednotlivé hodnoty z ní se přečtou až v něm? Viz Řešení některých častějších problémů (FAQ) » Univerzální obecné pravidlo.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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