2012-06-30 20 views
6

Poniżej moje struktury katalogów:Przekierowanie z jednego katalogu do drugiego z mod_rewrite

admin\ 
controls\ 
images\ 
media\ 
lib\ 
models\ 
views\ 
index.php 
.htaccess 

Poniżej jest mój .htaccess

RewriteEngine On 
RewriteRule /admin/images/(.*) /images/$1 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php 

Chcę wszystko w/admin/images być równa/obrazy w katalogu głównym. Na przykład: http://www.example.com/admin/images/example.png będzie taka sama jak http://www.example.com/images/example.png

problem z moim .htaccess jest: To idzie do index.php zamiast mirroring admin/zdjęć do obrazów/


Rozwiązanie

RewriteEngine On 
RewriteRule /admin/images/(.*) /images/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php 
+0

Ale w czym problem? – brezanac

+0

Przechodzi do index.php zamiast dublowania admin/images do images/ – invisal

Odpowiedz

10

Należy określić, że reguła przepisywania obrazu jest ostatnią z rzędu, aby zapobiec ponownemu przepisywaniu. W tym celu po prostu określ [L] na końcu reguły przepisywania obrazu.

RewriteEngine On 
RewriteRule /admin/images/(.*) /images/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php 

EDIT: Oto wyjaśnienie, dlaczego problem występuje (zaczerpnięte z sekcji komentarzy w celu uzyskania wyjaśnień).

Zobaczysz, że oryginalny %{REQUEST_FILENAME} nigdy się nie zmieni bez względu na to, ile etapów przepisywania zostanie przeprowadzonych. Oznacza to, że po osiągnięciu drugiej reguły ta zmienna będzie nadal wskazywać na istniejący obraz (który jest w /admin/images/) zamiast tego, który jest przepisywany i nieistniejący (/images/). To jest powód, dla którego druga zasada będzie zawsze stosowana i dlaczego dwie linie warunkowe z tego przykładu są prawie zawsze pierwszymi używanymi podczas przepisywania.

+1

Byłem głupi. Próbowałem [L] raz (może zapomniałem zaoszczędzić ten czas i to nie zadziałało). Bardzo Ci dziękuję. Już działa. – invisal

+0

Przepraszam, ja też chciałbym zrozumieć. RewriteCond mówi, że ostatnia reguła musi być zastosowana tylko wtedy, gdy żądany plik nie jest plikiem lub katalogiem ... czy obraz nie jest plikiem (zakładając, że obraz istnieje)? – Zagorax

+0

Masz rację, ale w tych zasadach ukryta jest mała sztuczka, która jest odpowiedzialna za zamieszanie :) Zobaczysz oryginalną '% {REQUEST_FILENAME}' ** ** nigdy ** nie zmieni się bez względu na to, ile etapów przepisywania zostanie przeprowadzonych. Oznacza to, że po osiągnięciu drugiej reguły ta zmienna będzie nadal wskazywała na istniejący obraz (który jest w '/ admin/images /') zamiast na tym, który został przepisany i nieistniejący ('/ images /'). To jest powód, dla którego druga zasada będzie zawsze stosowana i dlaczego dwie linie warunkowe z tego przykładu są prawie zawsze pierwszymi używanymi podczas przepisywania. – brezanac

4

Zmień regułę w następujący sposób:

RewriteEngine On 
RewriteRule ^admin/images/(.*) images/$1 

I umieść .htaccess w katalogu głównym dokumentu lub w folderze nadrzędnym 'admin'.

+0

Próbowałem i to nie działało. Wstawiam także katalog główny i folder administratora. W każdym razie, dziękuję za odpowiedź na moje pytanie. +1 – invisal

+0

Dość dziwne. Zajrzyj do http://www.francescoruvolo.it/test/admin/images/. Działa idealnie na moim serwerze. Nie mam żadnego index.html w/test/admin/images, podczas gdy mam go na test/obrazy. Czy twój plik httpd.conf pozwala na użycie .htaccess? – Zagorax

+0

Problemem jest moja inna RewriteRule przesłania tę RewriteRule. Dodanie [L] wystarczy rozwiązać problem. – invisal

Powiązane problemy