Обработка по умолчанию для несопоставленных доменов / поддоменов в Apache

12

У меня есть конфигурация Apache2 с несколькими виртуальными хостами. Мой DNS настроен на прием *.<domain>.<tld>на нескольких доменах. Все работает правильно, но если я иду к нему, something-random-here.example.comя, кажется, получаю неверный выбранный VirtualHost (я предполагаю первый или последний, который он находит). Есть ли способ указать Apache использовать определенные правила, если ни одна из записей VirtualHost не соответствует домену или поддомену? Я бы предпочел вернуть 404.

Ryall
источник

Ответы:

12

Apache использует первый виртуальный хост, если имя не совпадает. Просто настройте новый виртуальный хост как первый со случайным именем, отображая все, что вам нравится - или возвращая страницу 404.

Мориц Оба
источник
Спасибо, но не могли бы вы уточнить? Я не могу заставить это работать.
Ryall
2
Как выложены ваши конфигурационные файлы apache2? Или какую операционную систему вы используете? Apache читает конфигурацию в определенном порядке, и первый виртуальный хост, который он видит, является по умолчанию. Он получает весь трафик от неизвестных имен хостов. Так что, если у вас есть один файл конфигурации, первый VirtualHost это. Если у вас их несколько, как в большинстве linux, это может быть тот, который называется 0default или около того ...
Moritz Both
Я положил некоторые конфигурации по умолчанию в ports.conf. Это не сработало, потому что я пытался сопоставить *: 80, когда использовал <ip>: 80 на своих виртуальных хостах. Вместо этого мне пришлось создать отдельную запись по умолчанию для каждого IP, и теперь это работает.
Ryall
Ни мой первый, ни последний файл v-host не используются. Я думаю, что Apache изменился.
Кобольт
4

Подстановочный знак включает в себя файлы конфигурации вашего сайта:

Include path/to/site/confs/*httpd.conf

Организуйте файлы conf вашего сайта так, чтобы они загружались в ожидаемом порядке. Пример...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

и т.д...

Apache прочитает их по порядку. Затем создайте тот, который будет всегда загружаться последним, чтобы перехватить любые несоответствующие виртуальные хосты и вернуть 404 вместо загрузки сайта по умолчанию.

99-Catchall-httpd.conf

<VirtualHost *:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost *:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

Обязательно замените порты теми портами, которые слушает ваш httpd. Или, если у вас есть httpd, прослушивающий определенные интерфейсы, вам нужно вместо этого добавить ловушку для каждого интерфейса, например так:

<VirtualHost 192.168.1.101:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>
<VirtualHost 192.168.1.101:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

Надеюсь это поможет. Я использую этот метод для загрузки сайтов в указанном мной порядке и предотвращаю непреднамеренную загрузку неожиданного сайта несопоставленными виртуальными хостами.

Джейсон Слобоцки
источник
Разве «ServerAlias ​​*» не должен быть удален из всех правил?
Ahm3d Сказал
Я полагаю, это не имеет значения. Если ни один из виртуальных хостов до перехвата не обработает запрос, они вернут ответ 404. Я не вижу причины, по которой пришлось бы удалять ServerAlias ​​*, но они могут быть излишне специфичными.
Джейсон
0

Как уже Moritz Bothупоминалось, Apache2 будет использовать первый виртуальный хост, который он найдет, если он не соответствует ни одному из запрошенных вами.

Когда вы впервые устанавливаете Apache2, есть веб-сайт по умолчанию, который вы можете использовать в качестве шаблона, изменить или удалить, и мне всегда было интересно, для чего на самом деле был 000-default.conf, потому что у них тоже был default.conf. После прочтения Moritz Bothсказанного все становится более понятным.

Что я сделал для своего сервера, так это скопировал конфигурацию для имени хоста по умолчанию (веб-сайт) в файл 000-default.conf и a2ensite 000-default.

Теперь, каждый раз, когда на мой веб-сайт поступает непревзойденный запрос домена, он обслуживает страницу с 000 по умолчанию, которая является просто копией моей настоящей страницы по умолчанию.

Newteq Developer
источник
1
Я делаю то же самое, но мой несопоставленный хост / хост по умолчанию отправляет перенаправление на соответствующий сайт верхнего уровня, который также меняет отображаемый URL на правильный.
Иваниван
Это действительно отличная идея! Я не думал об этом. Я определенно буду реализовывать свой сайт таким образом :)
Newteq Developer
По некоторым причинам, я не могу заставить мой ssl (страницу по умолчанию) перенаправить. У меня есть, <VirtualHost *:443> ... Redirect / https://baseurl/ ... </VirtualHost> но URL остается прежним. Я сделал то же самое для не ssl-версии, и он перенаправляет правильно. Есть идеи?
Разработчик Newteq