Šta je novo?

mod_rewrite problem

ivan90BG

Cenjen
Učlanjen(a)
07.01.2010
Poruke
1,044
Poena
199
Pokušavam da napravim jednu rewrite šemu i naišao sam na problem.

Kod:
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule blablabla

Izgleda da će ovo zaustaviti samo čista imena fajlova i foldera, ali ne i staze. Znači ako adresa dođe kao

www.domen.com/folder/folder/fajl

tada će string "folder/folder/fajl" otići na RewriteRule na procesiranje, iako fajl postoji na toj putanji.

Kako se može podesiti da se stopira rewrite za sve fajlove i foldere u celom drvetu pod folderom u kome se nalazi .htaccess

🙂
 
Pa šta je ljudi, niko ne zna.

Evo da dopunim. Mod rewrite je sigurno uključen jer svi RewriteRule-ovi ispod uslova rade odlično, korektno preusmeravaju adrese. Kopam po dokumentaciji i tu vidima da ima raznih vrlo sličnih Apach-evih promenljivih, a dokumentacija u opšte ne objašnjava lepo šta se nalazi u svakoj.

Znači ima SCRIPT_FILENAME, SCRIPT_URL, SCRIPT_URI, REQUEST_FILENAME, REQUEST_URI. Jel može neko da mi objasni šta tačno svaka od ovih promenljivih sadrži. I na kakav tačno način mod-rewrite obrađuje adresu koristeći RewriteCond i RewriteRule.

🙂
 
Siroko pitanje, posebno je bump strasan. To sa jedne strane a sa druge cinjenica da je dobar mod_rewriter nesto kao vudu magician na webu, a ja to svakako nisam.
No, znam da se RewriteRule izvrsava samo ako su svi uslovi iznad ispunjeni, a tebi izgleda nedostaje RewriteBase / iznad ona 2 uslova.
Sve to ako sam dobro skapirao sta te tacno zanima.
 
E izvini, stavio "RewriteBase /sajt" (jer se ceo sajt nalazi u podfolderu DocumentRoot-a), samo nisam napisao u postu.

Znači cele adrese su tipa http://domen/sajt/strana/nesto/josnesto (s tim što josnesto, nesto i strana mogu da se izostavljaju). A RewriteRule-ovi su sledeći:

Kod:
RewriteRule ^([^/]+)$ main.php?lvl=1&cls=$1
RewriteRule ^([^/]+)/([^/]+)$ main.php?lvl=1&cls=$1&met=$2
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ main.php?lvl=1&cls=$1&met=$2&arg=$3

i kada dođe adresa http://domen/sajt/strana/nesto/josnesto, posto je RewriteBase /sajt, tada je string za rewrite "strana/nesto/josnesto" i pošto u ovom primeru ima tri stvari uhvatiće ga treći RewriteRule.

E sad, RewriteCond-ovi bi trebalo da spreče da stvarni folderi fajlovi koji postoje na serveru odu na rewrite. Ali kod mene to radi tako samo ako dođe ime fajla ili foldera koji se nalazi u samom folderu sajta, ali ne i ako je u nekom podfolderu. Znači ako dođe adresa http://domen/sajt/folder/folder/fajl, RewriteCond ga propušta i string "folder/folder/fajl" ide na rewrite.

Primetio sam jednu zanimljivu stvar, a to je da ako dođe adresa http://domen/sajt/folder/folder, Apach će stvarno prikazati sadržaj tog foldera, ali u adress baru browsera piše
http://domen/sajt/folder/folder/?lvl=2&cls=public&met=css
Uopšte ne razumem kako do toga dolazi.
 
Poslednja izmena:
Da ja ne bih zbunjivao i sebe i tebe, idi na mod_rewrite forum, pa tamo postavi pitanje. Richard ce ti sigurno pomoci.
 
Stvar je rešena :banana:

Saznao sam šta se dešava. RewriteCond utiče samo na jedan RewriteRule koji dolazi posle njega, što znači da ona moja dva RewriteCond-a vrede samo za prvi Rule. Jedno rešenje je da stavim iste RewriteCond-ove ispred 2. i 3. Rule-a, ali bolje rešenje (koje mi je dao google 😀) je koristiti obrnutu logiku. Šta raditi u slučaju ako SCRIPT_FILENAME jeste fajl ili folder koji postoji. Modifikovani set direktiva izgleda ovako:

Kod:
RewriteBase /sajt
RewriteCond %{SCRIPT_FILENAME} -f [OR]
RewriteCond %{SCRIPT_FILENAME} -d
RewriteRule ^.+$ - [L]

RewriteRule ^([^/]+)$ main.php?lvl=1&cls=$1 [L]
RewriteRule ^([^/]+)/([^/]+)$ main.php?lvl=2&cls=$1&met=$2 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ main.php?lvl=3&cls=$1&met=$2&arg=$3 [L]

Dakle, ako jeste fajl ili dir onda bilo koji string preusmeri na ništa (-), odnosno ne radi rewrite. Takođe sam stavio [L]-ove da ne bi bilo daljeg procesiranja za trenutni request.
 
Poslednja izmena:
Fino. MR je mocna alatka, sa strogom (aka zeznutom) logikom i jos gorom sintaksom.
Definitivno nije alat koji je nezan prema onome ko ga koristi - zato je i nagrada veca 🙂
 
Nazad
Vrh Dno