Этот код отлично работает в .htaccess или в каталоге
RewriteEngine on
RewriteCond %{request_uri} !^/dir/$ [NC]
RewriteRule ^(.*)$ /dir/ [END]
но когда помещается в VirtualHost, он вызывает бесконечное перенаправление.
Я читал документацию о различиях между request_uri в области виртуального хоста и каталога, но я все еще не могу создать код, который будет работать в контексте виртуального хоста. Что я должен изменить?
Я думаю, у вас наверняка конфликт с mod_dir (и DiretcoryIndex
). Хотя я удивлен, что это "отлично работает в .htaccess
"(если у вас есть что-то еще, что предотвращает петлю)?
Если переписать в голый каталог, т.е. /dir/
тогда mod_dir вызовет внутренний подзапрос на /dir/index.php
(или как там ваш DirectoryIndex
установлен на), и это, скорее всего, вызовет бесконечный цикл (несмотря на то, что вы END
флаг) с /dir/index.php
Спички !^/dir/$
.
Вы должны выполнять перезапись прямо в индексный документ, и это должно решить проблему. Например:
RewriteEngine on
RewriteRule !^/?dir/$ /dir/index.php [END]
Вам не нужен RewriteCond
директива, которая проверяет REQUEST_URI
, вы можете сделать ту же проверку в RewriteRule
шаблон - что немного более эффективно и избавляет вас от директивы.