IP-based Virtual-hosts в Apache2 на Ubuntu 12.04 LTS

Linux
«И что вы тут хотите нам рассказать?» — спросите вы. Да, действительно, на эту тему существует море статей. Но бывают закавыки: из-за «кривых рук» хостера или их лени, ошибок в настройках.
Опишу ситуацию: у знакомого было 2 независимых сервака в стойке хостера с разными ip, все было нормально, крутились несколько сайтов. Но платить лишнее никто не любит, потому было принято решение перекатить все на 1 сервер и 1 ip-адрес. Поставили новый сервак на Ubuntu12.04LTS
Было сделано: миграция баз сайтов, перенос каркасов сайтов в отдельные папки, синхронизация DNS, настройка apache2 для работы с виртуальными хостами, пробные заходы на сайты — вроде все работает. Но через некоторое время выяснился неприятный глюк, сайты можно было открывать как угодно: 1111111111111111111.vasja.ru или wwwwwwwwwwwwwwwwwwwwwwwww.yura.ru. Причем поисковые системы типа yandex накручивали себе ссылки такого рода. В общем есть проблема, надо решать.

Вариант 1: .htaccess нам в помощь: редирект домена без WWW на домен с WWW и наоборот, кладем в корень сайта, service apache2 restart и вуаля — не есть красиво, так как криворукие писатели статей не разбираются как прописывать материал — с/без www, а многие бесплатные движки — криво обрабатывают такой финт — вы можете получить статью без картинок например, лопатить за каждым дело неблагодарное.

Вариант 2: «покурив» пару вечеров google пришол к выводу, что не надо действовать по стандарту, прикручивать vhosts.conf и все прочие валенки и костыли. Решение лежит на поверхности, все делаем в единственном конфигурационном файле apache. Кусок кода apache2.conf с коментами:

# Переопределяем ServerRoot и ServerName
ServerRoot "/etc/apache2"
ServerName bubuntu

# Вырубаем зависимость от имен 
HostnameLookups Off
# Определяем порт и адрес для виртуальных серверов, поправьте так же файл ports.conf  
NameVirtualHost 9.9.9.9:80

# Определяем дефолтовый сайт для заглушки
<VirtualHost 9.9.9.9:80>
    ServerName default
# Судя положим наши .htaccess и index.html(php)-страничку 
    DocumentRoot /var/www/zaglushka
</VirtualHost>

# Настройки для сайта vasja
<VirtualHost 9.9.9.9:80>
        ServerName www.vasja.ru
        ServerAlias vasja.ru
        ServerAdmin vasja@vasja.ru
        DocumentRoot /var/www1/vasja/

        <Directory /var/www1/vasja/>
        ....
        </Directory>

        ErrorLog /var/log/apache2/vasja.error.log
        LogLevel warn
        CustomLog /var/log/apache2/vasja.access.log combined
</VirtualHost>

# Настройки для сайта petya
<VirtualHost 9.9.9.9:80>
        ServerName petya.ru
        ServerAlias www.petya.ru
        ServerAdmin petya@petya.ru
        DocumentRoot /var/www1/petya/

        <Directory /var/www1/petya/>
        ....
        </Directory>

        ErrorLog /var/log/apache2/petya.error.log
        LogLevel warn
        CustomLog /var/log/apache2/petya.access.log combined

</VirtualHost> 


Файл .htaccess для сайта заглушки:
# Незабудьте подключить расширение rewrite для apache!!!!
RewriteEngine on
# Поручаем ловить 404 и 410 ошибку узлу default
ErrorDocument 404 /index.html
ErrorDocument 410 /index.html


Накрапаем простенькую страничку index.html, кому горит — можете загнуть php, shtml и так далее со всеми вытекающими коррекциями. Я сделал предельно просто: index.html
#
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Ошибка 404!!!</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body bgcolor="white" text="#000000">
<center>
<div align="center"><span style="font-family: wp_bogus_font;">
<H1>Ошибка 404!</H1> 
Запрошенный вами адрес не существует. 
Если вы набирали адрес самостоятельно - проверьте правильность ввода.
<table border="0" cellpadding="0" cellspacing="0"></table>
</center>
</body>
</html>

Задаем права над каталогами и рестартим apache2:
sudo chown -R www-data:www-data /var/www/zaglushka /var/www1/petya /var/www1/vasja
sudo service apache2 stop && sudo service apache2 start
— советую делать через stop/start — так корректней (не остаются обломки прошлых сессий).

Вот теперь вуаля: wwww3.vasja.ru/about честно выкидывает нам окно с ошибкой 404. Конечно не совсем верно с нашей стороны на 410 код выдавать ответ как на 404-ый, но в окне ошибки мы говорим об адресе — так что по факту прокатит.

P.S.: Забыл пояснить одну сторону проблемы, самую главную: когда у вас поднята многосайтовая конфигурация, по-принципу ip-based, при неверной отдаче имен вашим DNS или хостера и возникает означенная проблема: не найдя необходимую конфигируацию и соотвественно сайт — apache тупо перебрасывает вас на первый сайт в конфигурации или первый по-алфавитному порядку. В итоге и получаем что apache начинает разводить самодеятельность с именами доменов.

7 комментариев

avatar
У меня заглушка такая

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.sysadminblog.ru [nocase]
RewriteRule ^(.*) http://sysadminblog.ru/ [last,redirect=301]
avatar
Пробовал сделать аналогично, не прокатило. Пошол к истокам апача
avatar
Чё та природа глюка мне непонятна — это с какого браузера можно открыть wwwwwwwww.<адрес сайта>.ru
Браузер пытается ресолвить имя — dns не дает — и всё.
avatar
это если пров не криворукий, а то есть бойцы которые пишут для www — *.<адрес сайта>.ru
avatar
Понял, просто у меня и www и ещё куча третьего уровня прописана. А то всю башку сломал.
avatar
вот и я думал что все просто, оказалось не так просто. Пришлось вернуться к истокам.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.