Я сталкиваюсь с проблемой использования директив Apache mod_vhost_alias
и mod_rewrite
для маршрутизации "симпатичных URL-адресов" на локальной машине разработки. Я знаю, что это возможно, потому что мой хостинг-провайдер использует аналогичную конфигурацию и не имеет проблем. Однако всякий раз, когда я пытаюсь установить свою локальную машину, Apache возвращает 500 Internal Server Error, а в журналах указывается слишком много внутренних перенаправлений.
Обычно Готово
Обычно при добавлении доменов на локальный компьютер для разработки я следую простому обычному процессу:
- Создайте каталог в
/path/to/www/
с именем в соответствии с доменом, то есть: /path/to/www/example.local/
- Добавить запись в
/etc/hosts
для нового домена, то есть: 127.0.0.1 example.local
- Добавить директиву
VirtualHost
для нового домена с DocumentRoot
, установленным в /path/to/www/example.local/pub/
- Перезагрузите Apache
Проблема
Недавно я начал использовать директиву VirtualDocumentRoot
, предоставленную mod_vhost_alias
, чтобы очистить мой постоянно растущий список директив VirtualHost
и избавить меня от хлопот перезапуска Apache после каждого нового домена:
CanonicalName Off
VirtualDocumentRoot /path/to/www/%0/pub/
В одном из доменов, скажем, example.local
, у меня может быть следующее:
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-l
RewriteRule .* index.php/%0 [L]
Это типичный "красивый URL" / шаблон маршрутизации для большинства современных приложений и сред. Однако Apache входит в бесконечный цикл перенаправления, когда я пытаюсь загрузить example.local/anything/that/should/work
в свой браузер.
Я включил RewriteLog
, чтобы определить, что происходит, и обнаружил, что Apache выполняет следующее:
- Удалить префикс каталога (
/path/to/www/example.local/pub/
) из URL
- Обрабатывайте
RewriteRules
нормально, как и ожидалось, генерируя /index.php/anything/that/should/work
- Снова добавьте префикс каталога, получив:
/path/to/www/example.local/pub/index.php/anything/that/should/work
- Начать сначала. (!?!?)
Вопрос
Кто-нибудь еще видел такое поведение и сформулировал исправление для него? Кроме того, может ли кто-то увидеть явную ошибку в моей конфигурации Apache, которая может отсутствовать?