Как избежать бесконечного цикла, когда htaccess перезаписывает копию того же htaccess-файла?

У меня есть этот файл htaccess:

RewriteEngine On

RewriteCond %{HTTP_HOST} =test.example.com [NC]
RewriteRule ^((?!test/).*)$ test/$1 [L,NC]

И полностью идентичная копия того же файла в папке "test". Так что, конечно, это приводит к бесконечному циклу, когда первый файл передает вам второй файл, снова выполняющий правила.

Я попытался добавить правило RewriteCond %{REQUEST_URI} !^test [L,NC] в надежде, что REQUEST_URI означает реальный путь, а не новый «псевдоним». Однако это не сработало.

Есть ли способ проверить, в каком каталоге мы находимся, чтобы использовать его в условии? Или любое другое решение этой проблемы? С основанием сохранить одинаковые коды обоих файлов.


person Peter Westerlund    schedule 06.11.2014    source источник
comment
Что вы на самом деле пытаетесь сделать? Перенаправлять все, что идет с test.example.com на test.example.com/test?   -  person arco444    schedule 06.11.2014
comment
Все, что идет в test.example.com, должно быть перенаправлено в корневую папку /test, за исключением случаев, когда вы уже находитесь в ней или были перенаправлены в нее.   -  person Peter Westerlund    schedule 06.11.2014


Ответы (2)


Если вы уже находитесь в каталоге test, нет смысла снова перезаписывать в каталог test, используя относительный путь. Будет лучше определить RewriteBase динамически и использовать абсолютные пути для перезаписи:

RewriteEngine On

# generate BASE dir in env variable %{ENV:BASE}
RewriteCond %{REQUEST_URI}::$1 ^(.*?/)(.*)::\2$
RewriteRule ^(.*)$ - [E=BASE:%1]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} =test.example.com [NC]
RewriteRule ^(.*)$ %{ENV:BASE}test/$1 [L,NC]

RewriteCond %{ENV:REDIRECT_STATUS} ^$ используется для предотвращения перезаписи после первой перезаписи правила, поскольку после этого %{ENV:REDIRECT_STATUS} становится 200.

person anubhava    schedule 06.11.2014
comment
Вау, я начинаю думать, может быть, это слишком сложный и лишний код для этой цели. Надеялся на небольшую остроту. Хм, мне нужно подумать об этом. - person Peter Westerlund; 06.11.2014
comment
Да, немного сложно сделать .htaccess независимым от подкаталога, в котором он находится. - person anubhava; 06.11.2014
comment
В противном случае, если вы всегда знаете имя подкаталога, просто используйте RewriteBase /test/ и избегайте динамического правила. - person anubhava; 06.11.2014

Хорошо, странно, но теперь я заставил это работать - просто так:

RewriteCond %{HTTP_HOST} =test.example.com [NC]
RewriteCond %{REQUEST_URI} !test [NC]
RewriteRule ^((?!test/).*)$ test/$1 [L,NC]

Изменить: кажется, что это работает только для стартовой страницы. На других страницах начальная косая черта пути удаляется.

person Peter Westerlund    schedule 06.11.2014