Очень похоже на: mod_rewrite игнорирует правила в подкаталогах
К сожалению, полученные вами правила не будут работать (если быть точными: они действительно работают - URL переписан ..но затем, когда Apache видит флаг [L]
, он переходит к другой итерации ... где он снова перезаписывается ... и снова - вход в бесконечный цикл, который Apache должен прервать в какой-то момент).
Вы должны добавитьнекоторое условие, которое полностью нарушит итерацию.Есть несколько возможных способов сделать это (зависит от остальных ваших правил, вы можете прочитать немного больше здесь - влияние на производительность порядка правил перезаписи при использовании apache mod_rewrite ).
Я изменил правило, добавив еще 2 условия, которые заставляют его переписывать ТОЛЬКО ЕСЛИ пункт назначения СУЩЕСТВУЕТ.
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com$
RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_URI} -d
RewriteRule (.*) %1/$1 [L,QSA]
Итак ... как это работает.Мы будем использовать этот URL в качестве примера: http://home.domain.com/kaboom.txt
.
- Если файл
domain.com/home/kaboom.txt
НЕ существует - ничего не происходит. - Если такой файл существует - URL получаетвнутренне переписан на
http://home.domain.com/home/kaboom.txt
(полный URL).Apache переходит к следующей итерации.Там он проверяет, существует ли domain.com/home/home/kaboom.txt
.Скорее всего, нет (если только у вас нет подпапок с тем же именем, что и у субдомена) и перезапись больше не происходит - задание выполнено.