PDA

Pogčedajte punu verziju : .htaccess problem


Blood
09. 10. 2006., 19:21
Ovo verovatno ne ide u php, ali ne znam gde drugde da ga stavim, neka moderatori prebace temu gde misle da treba da ide(samo ne u djubre :p)

Evo kratak opis problema, pravim neku scriptu koja treba da bude seo friendly. To sam resio preko .htaccess fajla, evo kako on ozgleda:


RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+[^/])$ $1/ [R,L]
RewriteRule ^login(.*)/$ /login.php [L]
RewriteRule ^admin/(.*)/$ /admin.php?act=$1 [L]
RewriteRule ^(.*)/$ /index.php?act=$1 [L]

i on radi super, problem nastaje kad se scripta ne nalazi u root-u, vec u nekom subdir-u.
Ja uzmem i prepravim kod da izgleda ovako:


RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^script/(.+[^/])$ $1/ [R,L]
RewriteRule ^script/login(.*)/$ /login.php [L]
RewriteRule ^script/admin/(.*)/$ /admin.php?act=$1 [L]
RewriteRule ^script/(.*)/$ /index.php?act=$1 [L]

medjutim to ne radi(naravno .htaccess file uploadujem u root/script/ dir), dobijem error 404 za npr http://root/script/test/ dok u lokalu radi savrseno

Da li neko zna gde gresim?

Hvala!

LiquidBrain
09. 10. 2006., 19:54
Lupam sada, ali mozda je problem u

RewriteBase /

probaj sa
RewriteBase /script/

Mozda ima nekog smisla :) A ipak mozda i nema...

oliver
09. 10. 2006., 19:58
ja sam TOTALNI laik za .htaccess, ali, zar ne bi trebalo da u drugom slucaju RewriteBase bude "/script" a ne "/", a RewriteRule-ovi ostaju nepromijeneni, tj:

RewriteBase /script
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+[^/])$ $1/ [R,L]
RewriteRule ^login(.*)/$ /login.php [L]
RewriteRule ^admin/(.*)/$ /admin.php?act=$1 [L]
RewriteRule ^(.*)/$ /index.php?act=$1 [L]

unaprijed se izvinjavam ako sam lupio :)

edit prestize me LiquidBrain :)

Petar Marić
09. 10. 2006., 20:03
Probaj:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^login/$ ./login.php [L]
RewriteRule ^admin/(.*)/$ ./admin.php?act=$1 [L]

RewriteRule ^(.*)/$ ./index.php?act=$1 [L]
</IfModule>


Sada bi trebalo da radi nezavisno od toga u koji dir ga strpas (nešto slično tome koristim za moj Django (http://www.djangoproject.com/) setup na DreamHost (http://www.dreamhost.com/r.cgi?122188)-u).

Blood
09. 10. 2006., 20:08
Probao sam i to, ali nije uspelo... :(
Mislim, ne prijavljuje mi 404 vec me baca na http://root/index.php
a probao sam onda i da mu stavim ovako

RewriteEngine On
RewriteBase /script/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^script/(.+[^/])$ $1/ [R,L]
RewriteRule ^script/login(.*)/$ /login.php [L]
RewriteRule ^script/admin/(.*)/$ /admin.php?act=$1 [L]
RewriteRule ^script/(.*)/$ /index.php?act=$1 [L]

A onda sam opet poceo da dobijam 404

Petar Marić
09. 10. 2006., 21:07
Ajd daj malo detaljnije informacije o podešavanjima:
* ime servera
* lokacija web root-a na disku
* relevantnu Virtual Host sekciju - ako postoji
* relativnu putanju do skripti u odnosu na web root na disku
* relativnu putanju do skripti u odnosu na web root za http
* putanje koje pokušavaš da dobiješ
* putanje koje dobijaš, ili grešku ako nju dobijaš
* relativnu putanju do .htaccess fajla u odnosu na web root na disku

I ako nije problem pošalji to za .htaccess koji sam ti dao, da ne analiziram druge.

dejanr
09. 10. 2006., 21:35
Probaj sa:

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
...


A evo i http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html pa kreni redom ...

ivanhoe
09. 10. 2006., 21:41
Ako stavis RewriteBase da ti je script, onda ti ne treba script/ u prvom parametru, jer se to automatski skida. U principu j RewriteBase bitan samo kad se koristi i mod_alias da bi Apache umeo da se snadje gde s sta nalazi, ovako kako ti radis mozes slobodno da ostavis kao u prvom primeru i da onda rewrite-ujes celu putanju.

Dakle, nesto ovako:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^script/(.+) /$1 [R,L]

RewriteRule ^script/login(.*) /login.php [L]
RewriteRule ^script/admin/(.*)/? /admin.php?act=$1 [L]
RewriteRule ^script/(.*)/? /index.php?act=$1 [L]


Ovo bi moralo da sljaka, mada nisam probao... ako ne bude radilo, probaj da izmenis flagove da budu [R,L] tako da se uradi externi redirect, tako ces da vidis koju adresu on pokusava da dohvati, pa ce ti biti jasno gde je problem..

Ako isprobavas ovo u localu (ili imas pristup httpd.conf na serveru) onda je najbolje da dodas u definiciju virtuelnog hosta:

RewriteLog /neka/putanja/rewrite.log
RewriteLogLevel 5


log level podesi izmedju 2 i 10 na nivo detalja koji ti treba (petica je po meni sasvim dovoljna), pa onda lepo u njemu pogledaj sta se desava korak po korak...

srdjevic
09. 10. 2006., 22:52
Ili mozes da SVE prebacujes na index.php, a da ti on bude switch. Onda u njemu pogledas path koji je trazen, pa mozes da odradis i header(location), a i include. ;-)

Blood
10. 10. 2006., 12:18
Hvala Vam svima na odgovorima, evo kako sam resio problem.


RewriteEngine On
RewriteBase /script/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+[^/])$ $1/ [R,L]
RewriteRule ^login(.*)/$ /script/login.php [L]
RewriteRule ^admin/(.*)/$ /script/admin.php?act=$1 [L]
RewriteRule ^(.*)/$ /script/index.php?act=$1 [L]


Kazu da je jutro pametnije od noci...

ivanhoe
10. 10. 2006., 13:25
postoji problem sa ovim pravilom: RewriteRule ^(.+[^/])$ $1/ [R,L]
Sta ako neko otkuca www.bla.com/script/nesto, bice preusmeren na www.bla.com/nesto, a ne na /script/index.php?act=nesto, odnosno vrlo je diskutabilno kad ce to pravilo reagovati, a kad onaj catch-all na kraju, jer ljudi ponekad kucaju / na kraju urla, a ponekad ne... ocekuje se da je www.bla.com/bla i www.bla.com/bla/ ista stvar, a tebi zbog ovog rewrite-a nije tako...

ako je ideja da tim pravilom uhvatis samo fajlove onda ti je bolje da insistiras na postojanju extenzije na kraju, nego na tome da fali /

Blood
10. 10. 2006., 13:41
postoji problem sa ovim pravilom: RewriteRule ^(.+[^/])$ $1/ [R,L]
Sta ako neko otkuca www.bla.com/script/nesto, bice preusmeren na www.bla.com/nesto, a ne na /script/index.php?act=nesto, odnosno vrlo je diskutabilno kad ce to pravilo reagovati, a kad onaj catch-all na kraju, jer ljudi ponekad kucaju / na kraju urla, a ponekad ne... ocekuje se da je www.bla.com/bla i www.bla.com/bla/ ista stvar, a tebi zbog ovog rewrite-a nije tako...


Tim pravilom sam hteo da postignem bas to da www.bla.com/script/nesto bude isto sto i www.bla.com/script/nesto/ tj to pravilo treba da dodaje / na svaku url koji nema na kraju /