Вопрос или проблема
У меня работает apache2, настроенный с двумя vhost.
Один сайт работает нормально. Но другой перенаправляется в неверный каталог.
Конфигурационные файлы идентичны, за исключением имен серверов и алиасов и, конечно, корневого каталога документа.
Я проверил с помощью apachectl -S
, и там есть дополнительная запись
Main DocumentRoot: "/var/www/html"
Я не нашел .conf файла, где задан этот каталог.
Как я могу изменить его, чтобы указывать на каталог второго vhost, который показывает этот неверный каталог?
Моя конфигурация vhost (как в вопросе):
<IfModule mod_ssl.c>
<VirtualHost *:443>
SSLEngine on
ServerName mydomain.com
ServerAlias mydomain.com
DocumentRoot /var/www/wordpress
SSLCertificateFile /etc/letsencrypt/live/domain1/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain1/privkey.pem
</VirtualHost>
</IfModule>
Другой аналогичен, только с другими каталогами и алиасами.
По сути, “Main DocumentRoot” – это DocumentRoot, определенный вне любого блока VirtualHost, и “/var/www/html” является заводским значением по умолчанию.
Этот более новый вопрос содержит хороший ответ на это: https://stackoverflow.com/q/56812397/6918262
Как уже подразумевает название, это значение DocumentRoot по умолчанию для виртуальных хостов, когда они сами не указывают таковое. Таким образом, если запрос соответствует блоку виртуального хоста, который не имеет директивы DocumentRoot для выполнения запроса, Apache использует корневой каталог документа по умолчанию или главный корневой каталог для выполнения запроса.
Корневой каталог документа Apache по умолчанию указан в двух местах:
- Опции времени компиляции или выполнения httpd.
- Основная конфигурация сервера, которая является конфигурацией, заданной вне блоков виртуальных хостов. Любая конфигурация виртуального хоста в основном берет значения по умолчанию из основной конфигурации сервера.
Примечание: Значение корневого каталога документа, указанное в основной конфигурации сервера, переопределит значение, унаследованное от опции времени компиляции или выполнения.
Пожалуйста, ознакомьтесь с этой ссылкой для получения дополнительной информации:
Ответ или решение
Устранение проблемы с неправильным DocumentRoot в Apache2
Ваша проблема с неправильным DocumentRoot в конфигурации Apache2 связана с тем, что сервер использует основной DocumentRoot, заданный вне блоков виртуального хоста. Понимание того, как работает конфигурация Apache и как корректно настраивать виртуальные хосты, поможет вам решить эту проблему.
Почему возникает такая проблема?
Как вы уже заметили, в выводе команды apachectl -S
отображается запись Main DocumentRoot: "/var/www/html"
. Это значит, что основное значение DocumentRoot, не переопределенное в блоках виртуального хоста, равно этому пути.
Apache ищет конфигурацию следующим образом:
- Основная конфигурация сервера (обычно в файлах вроде
apache2.conf
илиhttpd.conf
). Здесь может быть установлен основной DocumentRoot, который будет использоваться по умолчанию. - Конфигурация виртуальных хостов. Если виртуальный хост не имеет заданного DocumentRoot, Apache использует основной DocumentRoot.
Как изменить DocumentRoot для вашего второго виртуального хоста?
Для того чтобы изменить этот основной DocumentRoot и указать другой путь для вашего второго виртуального хоста, выполните следующие шаги:
-
Редактирование конфигурационных файлов:
- Откройте основной файл конфигурации Apache, например,
/etc/apache2/apache2.conf
или/etc/httpd/conf/httpd.conf
. - Проверьте наличие строки, где определен основной DocumentRoot. Если такая строка присутствует, измените её на нужный вам путь или прокомментируйте её, если хотите явно задать DocumentRoot в каждом виртуальном хосте.
- Откройте основной файл конфигурации Apache, например,
-
Указание DocumentRoot в виртуальных хостах:
- Обязательно проверьте оба файла виртуальных хостов, чтобы убедиться, что в каждом из них задан правильный DocumentRoot. Например, вы можете иметь следующие настройки:
<IfModule mod_ssl.c> <VirtualHost *:443> SSLEngine on ServerName mydomain.com ServerAlias www.mydomain.com DocumentRoot /var/www/wordpress SSLCertificateFile /etc/letsencrypt/live/domain1/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/domain1/privkey.pem </VirtualHost>
<VirtualHost *:443>
SSLEngine on
ServerName anotherdomain.com
ServerAlias www.anotherdomain.com
DocumentRoot /var/www/anotherdirectory
SSLCertificateFile /etc/letsencrypt/live/domain2/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain2/privkey.pem
- Обязательно проверьте оба файла виртуальных хостов, чтобы убедиться, что в каждом из них задан правильный DocumentRoot. Например, вы можете иметь следующие настройки:
-
Перезагрузка Apache:
- После внесения изменений не забудьте перезагрузить сервер Apache для применения новых настроек:
sudo systemctl restart apache2
или
sudo service apache2 restart
- После внесения изменений не забудьте перезагрузить сервер Apache для применения новых настроек:
-
Проверка конфигурации:
- После перезагрузки проверьте конфигурацию Apache, используя команду:
apachectl -S
Убедитесь, что все виртуальные хосты настроены правильно и у них указаны правильные DocumentRoot.
- После перезагрузки проверьте конфигурацию Apache, используя команду:
Заключение
Неправильный DocumentRoot в настройках Apache2 может вызывать перенаправления на неверные директории. Правильная настройка DocumentRoot для каждого виртуального хоста и проверка основной конфигурации — ключ к успешной работе вашего веб-сервера. Убедитесь, что все изменения тестируются после перезагрузки сервера, чтобы избежать возможных ошибок в конфигурации.