VirtualHost в Apache позволяет запускать несколько сайтов на одном компьютере или сервере.
Например, вместо адресов вида:
- http://localhost/site1/
- http://localhost/site2/
можно использовать нормальные локальные домены:
- http://site1.local/
- http://site2.local/
Каждый домен будет открывать свою папку.
Это удобно при локальной разработке, тестировании нескольких сайтов и работе с проектами, которым нужны собственные доменные имена.
Что такое VirtualHost
VirtualHost, или виртуальный хост, — это отдельная конфигурация сайта внутри Apache.
Один экземпляр Apache может обслуживать несколько сайтов. Apache определяет, какой сайт нужно показать, по имени хоста из HTTP-запроса или по IP-адресу и порту.
Существует два основных варианта:
- name-based VirtualHost — несколько сайтов используют один IP-адрес, а Apache различает их по доменному имени;
- IP-based VirtualHost — для разных сайтов используются разные IP-адреса или комбинации IP и портов.
Для обычной локальной разработки почти всегда достаточно name-based VirtualHost. Apache прямо рекомендует его как более простой вариант в большинстве случаев.
Пример задачи
Допустим, у нас есть сайт в папке:
- C:\Sites\example
и мы хотим открывать его в браузере по адресу:
- http://example.local/
Для этого нужно сделать три вещи:
- добавить VirtualHost в Apache;
- добавить доменное имя в файл hosts Windows;
- проверить конфигурацию и перезапустить Apache.
Где находится конфигурация VirtualHost
Путь зависит от того, как установлен Apache.
При обычной установке Apache 2.4 структура может выглядеть так:
- C:\Apache24\
Основной конфигурационный файл:
- C:\Apache24\conf\httpd.conf
А виртуальные хосты часто хранятся отдельно:
- C:\Apache24\conf\extra\httpd-vhosts.conf
В httpd.conf должна быть подключена эта конфигурация:
Include conf/extra/httpd-vhosts.conf
#Include conf/extra/httpd-vhosts.conf
#Include conf/extra/httpd-vhosts.conf
Настройка VirtualHost
Откройте файл:
- conf\extra\httpd-vhosts.conf
и добавьте:
ServerName example.local
DocumentRoot "C:/Sites/example"
Require all granted
Минимально важные директивы здесь:
- ServerName — доменное имя сайта.
- ServerName example.local
- DocumentRoot — каталог, из которого Apache будет отдавать файлы.
- DocumentRoot «C:/Sites/example»
Apache рекомендует явно задавать ServerName для каждого name-based VirtualHost. Если этого не сделать, поведение при выборе виртуального хоста может оказаться неожиданным.
Зачем нужен блок Directory
Одного DocumentRoot может быть недостаточно.
Apache должен иметь разрешение обслуживать файлы из указанной директории:
Require all granted
Без этого при открытии сайта можно получить ошибку:
- 403 Forbidden
В Apache 2.4 для управления доступом используются директивы семейства Require.
Настройка файла hosts в Windows
Сам Apache уже знает о example.local, но Windows пока не знает, куда направлять такое имя. Нужно добавить его в файл:
- C:\Windows\System32\drivers\etc\hosts
Откройте редактор от имени администратора и добавьте:
- 127.0.0.1 example.local
Теперь Windows будет направлять запросы к example.local на локальный компьютер.
После сохранения можно проверить:
ping example.local
Имя должно разрешаться в:
- 127.0.0.1
Проверка конфигурации Apache
httpd.exe -t
Если всё нормально:
- Syntax OK
Если есть ошибка, Apache обычно покажет файл и строку конфигурации, где она обнаружена.
После этого полезно посмотреть, как Apache видит виртуальные хосты:
httpd.exe -S
Для Windows Apache прямо рекомендует httpd.exe -S как инструмент диагностики VirtualHost-конфигурации.
Вы увидите список виртуальных хостов, портов и файлов конфигурации.
Перезапуск Apache
httpd.exe -k restart
или через Windows Services:
Win + R
services.msc
найдите службу Apache и выберите Перезапустить.
После этого откройте:
- http://example.local/
Несколько сайтов на одном Apache
Допустим, есть два проекта:
- C:\Sites\site1
- C:\Sites\site2
Можно настроить:
ServerName site1.local
DocumentRoot "C:/Sites/site1"
Require all granted
ServerName site2.local
DocumentRoot "C:/Sites/site2"
Require all granted
В hosts:
- 127.0.0.1 site1.local
- 127.0.0.1 site2.local
После перезапуска Apache:
- http://site1.local/
откроет первый проект, а:
- http://site2.local/
— второй.
Именно для этого VirtualHost обычно и используется в локальной разработке.
ServerAlias
Если один сайт должен открываться по нескольким именам, используется ServerAlias.
Например:
ServerName example.local
ServerAlias www.example.local
DocumentRoot "C:/Sites/example"
Require all granted
В hosts нужно добавить оба имени:
- 127.0.0.1 example.local
- 127.0.0.1 www.example.local
ServerAlias предназначен именно для дополнительных имён одного виртуального хоста.
Нужен ли NameVirtualHost в Apache 2.4
Нет.
В старых инструкциях можно встретить:
NameVirtualHost *:80
Для Apache 2.4 эта директива не нужна.
Достаточно:
и корректно заданных ServerName.
Поэтому при обновлении очень старых конфигураций строку NameVirtualHost переносить в новую настройку не требуется.
Почему открывается не тот сайт
Это одна из самых частых проблем VirtualHost.
Если Apache не находит ServerName или ServerAlias, соответствующий имени из запроса, он может использовать первый подходящий VirtualHost для данного IP и порта.
Проверяйте:
httpd.exe -S
и убедитесь, что:
- у каждого VirtualHost есть ServerName;
- имена не дублируются;
- нужный конфигурационный файл действительно подключён;
- запрос приходит на правильный порт.
Ошибка 403 Forbidden
Если домен открывается, но Apache отвечает:
- 403 Forbidden
проверьте блок:
Require all granted
Также убедитесь:
- каталог существует;
- путь указан правильно;
- Apache имеет доступ к нему;
- настройки родительских каталогов не запрещают доступ.
Домен не открывается вообще
127.0.0.1 example.local
ping example.local
Если имя не разрешается, проблема находится ещё до Apache.
Можно очистить DNS-кэш Windows:
- ipconfig /flushdns
и повторить проверку.
Apache не запускается после добавления VirtualHost
httpd.exe -t
Частые причины:
- пропущена закрывающая директива ;
- ошибка в пути;
- лишняя кавычка;
- неправильная директива;
- конфликт порта;
- ошибка в подключаемом конфигурационном файле.
После исправления снова добейтесь:
Syntax OK
VirtualHost на другом порту
Можно использовать не только порт 80.
Например:
Listen 8080
ServerName example.local
DocumentRoot "C:/Sites/example"
Require all granted
Тогда адрес:
- http://example.local:8080/
Если для виртуальных хостов используется другой порт, Apache должен слушать его через Listen.
VirtualHost и HTTPS
Для HTTPS обычно используется отдельный виртуальный хост на порту 443:
ServerName example.com
DocumentRoot "C:/Sites/example"
SSLEngine on
...
Но здесь уже понадобятся SSL-сертификат и дополнительные настройки TLS.
Для обычной локальной разработки без HTTPS этот блок не нужен.
Короткий рабочий пример
ServerName example.local
DocumentRoot "C:/Sites/example"
Require all granted
Windows hosts:
- 127.0.0.1 example.local
Проверка:
httpd.exe -t
httpd.exe -S
httpd.exe -k restart
После этого:
- http://example.local/
должен открывать содержимое:
- C:\Sites\example















