2012-06-30 4 views
6

Ниже мои структуры каталогов:Перенаправление из одной директории в другую с mod_rewrite

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

Следующая моя .htaccess

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

Я хочу, чтобы все, в/админ/изображения равна/изображения в корневом каталоге. Например: http://www.example.com/admin/images/example.png будет таким же, как http://www.example.com/images/example.png

Проблема с моей .htaccess является: Он идет в index.php вместо зеркальных админ/изображения к изображениям/


Решение

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

Но в чем проблема? – brezanac

+0

Он обращается к index.php вместо зеркалирования admin/images to images/ – invisal

ответ

10

Необходимо указать, что ваше правило перезаписи изображения является последним в строке, чтобы предотвратить дальнейшую переписывание. Для этого вы просто указываете [L] в конце правила перезаписи изображения.

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

EDIT: Вот объяснение, почему возникает проблема (взято из раздела комментариев, чтобы обеспечить разъяснение).

Вы видите, что оригинал %{REQUEST_FILENAME} никогда не изменится независимо от того, сколько выполняется стадий перезаписи. Это означает, что когда будет достигнуто второе правило, эта переменная будет по-прежнему указывать на существующее изображение (которое находится в /admin/images/), вместо того, чтобы быть переписанным и несуществующим (/images/). Вот почему второе правило всегда применяется и почему две условные строки из примера почти всегда являются первыми, которые будут использоваться во время перезаписи.

+1

Я был глуп. Однажды я попробовал [L] (возможно, я забыл сохранить это время, и это не сработало). Большое спасибо. Он работает сейчас. – invisal

+0

Извините, я тоже хотел бы понять. RewriteCond говорит, что последнее правило должно применяться только в том случае, если запрошенный файл не является файлом или каталогом ... не является ли образ файла (предполагается, что изображение существует)? – Zagorax

+0

Вы правы, но в этих правилах крошечный трюк, который несет ответственность за путаницу :) Вы видите, что исходный '% {REQUEST_FILENAME}' будет ** никогда не изменяться, независимо от того, сколько выполняется стадий перезаписи. Это означает, что при достижении второго правила эта переменная будет по-прежнему указывать на существующее изображение (которое находится в '/ admin/images /'), а не на переписанное и несуществующее ('/ images /'). Вот почему второе правило всегда применяется и почему две условные строки из примера почти всегда являются первыми, которые будут использоваться во время перезаписи. – brezanac

4

Изменить правило следующим образом:

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

И поместите свой .htaccess в свой корень документа, или же в родительскую папку '/ admin'.

+0

Я пробовал и не работал. Я также добавил папку с правами администратора и администратора. В любом случае, спасибо за ответ на мой вопрос. +1 – invisal

+0

Довольно странно. Посмотрите http://www.francescoruvolo.it/test/admin/images/. Он отлично работает на моем сервере. У меня нет index.html в/test/admin/images, пока у меня есть один на тесте/изображениях. Ваш httpd.conf позволяет использовать .htaccess? – Zagorax

+0

Проблема в том, что мой другой RewriteRule переопределяет этот RewriteRule. Добавление [L] просто решает проблему. – invisal

Смежные вопросы