Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mod Rewrite przepisujący wszystko - problem
Forum PHP.pl > Forum > PHP
croc
Witajcie,

mam plik .htaccess zdefiniowany następująco:

Kod
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.+$ index.php?path=$0 [L]

Chcę, by przepisywane było wszystko, poza istniejącymi plikami. Foldery mają też być przepisane, bo nie zależy mi na dostępach do folderów bez podania pliku. Wszystko działa, ale jest pewien problem. Po wejściu na link z nazwą taką, jak istniejący folder, widoczna w linku staje się zmienna GET.

PRZYKŁAD:
Mam folder images. Po wejściu na http://localhost/images skrypt działa prawidłowo, ale w pasku adresu jest http://localhost/images/?path=images. Dla nazw niepokrywających się z folderami wszystko jest w porządku.

Co jest przyczyną tego zachowania?

EDIT
Dodam, że dla http://localhost/images/ (ze slashem na końcu) problem nie występuje.
Sephirus
Spróbuj dodać jeszcze:

Kod
RewriteCond %{REQUEST_FILENAME} !-d


To powinno omijać także foldery
by_ikar
To nie ominie folderu niestety. Przyczyną może być to że apache najpierw przeszukuje dysk czy taki folder istnieje, a dopiero potem dopasowuje regułki zdefiniowane w htaccess. W przypadku kiedy podajesz slash na końcu, od razu szuka katalogu, tyle że u ciebie w rewritecond pominięte są katalogi i trzeba podać ścieżkę do pliku, więc szuka najpierw katalogu, potem pliku, nie znajduje pliku i dalej działa regułka z htaccess, tyle że już apache przekierowuje cię do katalogu, bo taki katalog znalazł. Nie wiem czy tak jest na pewno, ale tak mi się wydaje po przeanalizowaniu szybkim że tak to może działać. Rozwiązaniem może być stworzenie innego katalogu obrazów, albo innej regułki..
croc
Celowo uniknąłem tego wpisu:
Kod
RewriteCond %{REQUEST_FILENAME} !-d

Tak jak wspomniałem w pierwszym poście, nie chcę blokować żadnych nazw, nawet takich pokrywających się z istniejącymi folderami. Bezpośredni dostęp do folderów jest mi po prostu niepotrzebny. Zależy mi, by każda nazwa dopasowana do wzorca kierowana była do index.php, oczywiście za wyjątkiem tych, które pokrywają się z rzeczywistymi plikami.
Sephirus
Ok racja mój błąd - nie doczytałem tego dokładnie (wybaczcie chory jestem :/).

Mam pewien pomysł, który może pomóc ale nie musi - nie mam jak sprawdzić ale co by było gdybyś dał coś takiego:

Kod
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.+[^/]{1}$ $0/ [L] // Można dać też flagę [R] zobaczyć która lepiej będzie działać

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.+$ index.php?path=$0 [L]


Jeśli dobrze napisałem to powinno być ok - co to robi? Pisałeś że jak jest "/" na końcu to działa bez zarzutu - to powinno dodawać "/" na koniec tylko do prawdziwych folderów i przekierować na adres "obsługiwalny" - nie wiem tylko jak twój skrypt sobie z tym poradzi i jakie dane dostanie podczas dodawania tego "/" - zależy to pewnie od flagi

HTH! wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.