Этот код отлично работает в .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
- что немного эффективнее и избавляет вас от директивы.