Apache Virtual Hosts
У сервера есть несколько IP-адресов, на нем необходимо разместить также несколько сайтов.
Нужно, чтобы при переходе по имени домена открывался соответствующий ему сайт. При этом
при переходе по IP-адресу или по любому другому имени, кроме избранных, должна открываться страница-заглушка.
Пусть сайт один, назовем его mysite.ru.
В файле /etc/httpd/conf/httpd.conf где-то вначале указано
DocumentRoot /var/www/html
В конце дописываем
NameVirtualHost *:80
<VirtualHost *:80>
ServerName mysite.ru
ServerAlias www.mysite.ru
DocumentRoot /var/www/mysite.ru/html
</VirtualHost>
Таким образом файлы mysite.ru можно складывать в /var/www/mysite.ru/html.
Однако, если оставить так, то переадресовываться в /var/www/mysite.ru/html будут все запросы (с любым именем сервера). Это поведение описано в документации Apache следующим образом:
«The first VirtualHost section is used for requests without a known server name.»
То есть вместо того, чтобы для имен, не попадающих ни под одно из условий ServerName, использовать значения DocumentRoot по умолчанию, сервер берет данные из секции VirtualHost для чужого имени.
Поэтому перед секцией с хорошим сайтом mysite.ru добавляем секцию-ловушку. Получается примерно так:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName mail.mysite.ru # тут вообще неважно, какое имя писать
</VirtualHost>
<VirtualHost *:80>
ServerName mysite.ru
ServerAlias www.mysite.ru
DocumentRoot /var/www/mysite.ru
</VirtualHost>
Ну и конечно перезапускаем сервер
$ service httpd restart
В результате в папке /var/www/mysite.ru/html лежит работоспособный сайт, а в папке /var/www/html лежит страница-заглушка с текстом на все случаи жизни – «Вы не туда попали».
—
Пример конфигурации реальной системы
<VirtualHost *>
ServerName domain.tld
ServerAlias www.domain.tld another_domain.tld www.another_domain.tld
DocumentRoot /var/www/vhosts/domain.tld/httpdocs
ErrorLog logs/domain.tld.error_log
TransferLog logs/domain.tld.access_log
SymLinksBaseDir /var/www/vhosts/
ScriptAlias /cgi-bin/ /var/www/vhosts/domain.tld/cgi-bin//
<Directory "/var/www/vhosts/domain.tld/httpdocs">
AllowOverride All
Options +Includes
</Directory>
php_admin_value open_basedir /var/www/vhosts/domain.tld/
php_admin_value doc_root /var/www/vhosts/domain.tld/httpdocs
php_admin_value upload_tmp_dir /var/www/vhosts/domain.tld/tmp/
php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fphp-sender@domain.tld"
</VirtualHost>