У меня есть локальный сервер Apache для разработки страниц. Поэтому у меня есть корневая папка, в которой все разные страницы находятся в подпапках. Затем в этих папках есть другие подпапки для общедоступного контента. Это может быть - в зависимости от фреймворка - другая папка (например, общедоступная, wwwroot, webroot, httpdocs).
Структура папки:
/
|-- срв
|-- http
|-- страница
| |-- корневой каталог
| |-- .htaccess
| |-- index.php
|-- стр.2
|-- публичный
|-- index.php
Теперь вместо использования http://localhost/page/webroot я хочу использовать http://page.localhost/ Схема URL, потому что она должна быть такой же, как в реальном мире (например, ссылки, которые указывают на корень, должны работать и так далее).
Сначала я попробовал с Корень виртуального документа /srv/http/%-2/webroot/
который, кажется, работает довольно хорошо, если на всех страницах папка webroot является общей папкой. Однако это не работает, если общая папка имеет другое имя.
Итак, мой второй подход заключался в использовании mod_rewrite. с чем-то вроде:
Корень документа /srv/http
RewriteEngine включен
RewriteCond %{HTTP_HOST} (.+)\.[^\.]+$
RewriteCond %{DOCUMENT_ROOT}/%1/webroot -d
RewriteRule ^(.+) %{DOCUMENT_ROOT}/%1/webroot/$1 [L]
(Последние 3 строки можно повторить для других папок — здесь они пропущены для удобочитаемости)
Сначала это выглядело довольно многообещающе, но потом я обнаружил, что это не работает, если на странице есть файл .htaccess с локальным mod_rewrite, который сопоставляет все запросы с index.php (как это делают некоторые фреймворки). В этом случае mod_rewrite запустит бесконечный цикл, так как динамическая часть пути обрабатывается как подпапка, а не как DocumentRoot. Вот вывод из журнала:
https://pastebin.com/4aNgRahx
Это повторяется до тех пор, пока не будет достигнут предел рекурсии.
Файл .htaccess выглядит так:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^ index.php [L]
</IfModule>
Если я отключу его, он будет работать.
Так что мне теперь делать?
Изменение .htaccess или любых файлов в папке проекта не вариант, потому что тогда он больше не будет работать на реальном сервере.