Допустим, мы создали несколько виртуальных хостов. Пусть будут следующие,
allmydrawings.com.conf
dev.tulvit.net.conf
scomedy.com.conf
blog.tulvit.net.conf
englishnode.com.conf
tulvit.net.conf
Вопрос. Что Апач "отдаст", если обратиться напрямую к ip сервера (для локалки это localhost или 127.0.0.1)? Или если мы принимаем все сабдомены по маске *.site.com, и перейдем по несуществующему домену? Или если мы удалили какой-то сайт, а DNS еще не успели обновиться?
Во всех случаях Апач вернет "дефолтный" виртуальный хост. А дефолтным он считает самый первый по алфавитному порядку.
Другими словами, если я введу в адресную строку 192.155.82.105 (ip моего сервера), откроется allmydrawings.com
Или вот только что удалил demo.tulvit.net за ненадобностью, но DNS-ы не успели обновиться. Что открывалось по этому домену в течение нескольких часов? allmydrawings.com
Линод еще предоставляет системные урлы для доступа к локалхосту своему, вида id.members.linode.com И что по нему тоже открывается? Снова allmydrawings.com Т. е. выходит суть копия сайта на поддомене Линода. Причем GoogleWebmasters тоже в курсе этого:
Что делать? Настроить и включить дефолтный виртуальный хост. Из коробки Апач предлагает следующий:
000-default.conf
Начинается с нулей как раз для того, чтобы быть вверху списка.
Ок, включаем этот дефолтный виртуальный хост, перезагружаем Апач.
a2ensite 000-default.conf
service apache2 reload
Смотрим, что отдается теперь во всех вышеприведенных случаях. А отдается теперь стандартная Апачевская заглушка, с 200 OK! ответом сервера.
В принципе, так это можно и оставить, почему бы и нет.
Но почему бы не поступить и по-другому. Отдавать не Апачевскую страницу, а банальный 404 "Page Not Found".
А еще лучше - 503 (Service Unavailable), и с более осмысленным сообщением. Например, "Nothing to see here!" Ведь действительно, это не то чтобы какая-то страница не найдена, а просто тут не на что смотреть, можно проходить мимо. И вообще выдавать кастомные сообщения - очень даже хорошая идея. Пройдет время, все забудется, как и что делал. Но если вдруг к этому вернешься - сразу же поймешь, что раз ответ нестандартный, значит сам что-то настраивал, а не конфиг "из коробки".
Ок, создаем наш новый виртуальный хост, назовем его _default.conf (опять же, чтобы был в начале списка, поэтому с подчеркивания):
sudo nano /etc/apache2/sites-available/_default.conf
Cо следующим содержанием:
<VirtualHost *:80>
Redirect 503 /
ErrorDocument 503 "Nothing to see here!"
</VirtualHost>
Отключаем 000-default.conf, включаем наш новый _default.conf, перезагружаемся.
a2dissite 000-default.conf
a2ensite _default.conf
service apache2 reload
Проверяем:
"Nothing to see here!", 503 ответ сервера. Just as planned!
PS
Пост писался под Apache/2.4.29 Ubuntu, но разные версии могут незначительно отличаться. Например, в Apache/2.2.22 Debian по умолчанию вроде как нет 000-default.conf файла, а просто default.conf, плюс не разрешает создавать конфигурационные файлы, начинающиеся с подчеркивания, поэтому свой кастомный можно назвать 0-default.conf заместо _default.conf, например.
Комментарии
Полезная запись, сам постоянно все забываю это.
Я так еще подумал, в некоторых случаях может лучше будет не выдавать ошибку, а редиректить на какой-то основной сайт, если таковой имеется. В моем случае на tulvit.net
Возможно именно так и поступлю потом, как буду с нуля сервак переставлять в марте (сейчас сижу на Дебиан 7, лол, поддержка которого закончилась в мае прошлого года, проще форматнуть винт и по-новой все накатить, ну и соответственно до сих пор на серваке у меня пхп5, а займусь именно в марте, т. к. с марта Друпал перестанет поддерживать пхп5 уже, другими словами тянул до последнего, а сейчас уже придется).
Почему Apache? Пост из 2007?
Apache имеет фундаментальные изъяны.
Весь цивилизованный мир давно перешел на php-fpm, за исключением legacy проектов.
Из 2013-го, когда настраивал свой текущий VPS, больше который не трогал, работает и ладно. Там сейчас не только Апач, но и PHP5 и уже с год как не поддерживающаяся версия Дебиана.
В самом что ни на есть ближайшем будущем буду все это обновлять, и теперь уже да, nginx.