Apache по умолчанию / Catch-All Виртуальный хост?


67

Если у меня есть 3 домена: domain1.com, domain2.com и domain3.com, возможно ли настроить виртуальный хост по умолчанию для доменов, не указанных в списке? Например, если бы я имел:

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain1
ServerName domain1
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain2
ServerName domain2
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/everythingelse
ServerName *
ServerAlias host
</VirtualHost>

Если вы зарегистрируете домен и укажете его на мой сервер, по умолчанию все будет отображаться так же, как и домен3. Это возможно?

Ответы:


45

Да, это должно работать, за исключением того, что ServerAlias ​​должен быть "*", с именем сервера, установленным на фактическое имя хоста. Возможно, вам нужно убедиться, что VirtualHost загружен последним ...


Это должно работать, но не работает. Если домен не указан в списке, я получаю «Firefox не может найти сервер».
SJaguar13

2
Вы установили его как «имя хоста ServerName» и «ServerAlias ​​*»? Первоначально я не подчеркивал этого достаточно, но ServerName не принимает подстановочные знаки, только ServerAlias. ServerName должно быть фактическим именем хоста.
Freiheit

Кроме того, другие виртуальные хосты работают? Какая версия apache?
Freiheit

«Firefox не может найти сервер». это не проблема Apache. Вам нужно больше подробностей (с каким сервером, если таковые имеются, какой код ошибки ...)
Law29

Странно, что у меня не работает, он всегда выбирает первого виртуального хоста независимо от заголовка хоста
jjxtra

80

При использовании виртуальных хостов на основе имен первая загруженная конфигурация виртуального хоста будет использоваться по умолчанию (Источник: Apache Wiki ). Например, с конфигурацией ниже, в противном случае несопоставленные домены будут соответствовать domain-one.com:

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName domain-one.com
  # Other options and directives ..
</VirtualHost>

<VirtualHost *:80>
  ServerName domain-two.com
  # Other options and directives ..
</VirtualHost>

Многие серверы не имеют монолитного файла конфигурации, но имеют несколько специфичных для хоста файлов конфигурации, организованных следующим образом:

/etc/apache2
|-- sites_available  (actual configuration files)
`-- sites_enabled    (symlinks to files in sites_available)

В этом случае, чтобы сначала загрузить конкретную конфигурацию виртуального хоста, переименуйте символическую ссылку во что-то, что будет первым при сортировке, например 00-default.


Некоторые из других ответов не совсем верны. Согласно Apache Wiki, не указывать ServerNameна виртуальном хосте неверно. Если хост без a ServerNameне загружается первым, Apache может даже никогда не использовать его, поскольку первый загруженный хост будет использоваться по умолчанию.

Кроме того, хотя ServerAlias *он действительно будет соответствовать чему-либо, он также может переопределять другие виртуальные хосты, определенные позже. Может быть, этот подход будет работать, если он всегда будет определяться последним виртуальным хостом (как в конфигурации, указанной в вопросе), но это означает добавление новой директивы и изменение порядка сортировки, а не просто изменение порядка, как указано выше.


+ 1 миллион интернетов к вам, сэр! Это должно быть первым, чтобы быть по умолчанию.
Райан

Знаете ли вы, какой из них стоит первым: httpd.conf или conf.d / xyz.conf?
Эса Варемо

2
«первая загруженная конфигурация виртуального хоста будет использоваться по умолчанию», - решил мою проблему с локальными доменами SSL в XAMPP (Windows). Похоже, что Apache использует первый vhost в качестве значений по умолчанию для каждого порта, поэтому для правильной обработки несоответствующих доменов как для незащищенных, так и для защищенных запросов должны быть две явные конфигурации «по умолчанию» для портов 80/443, определенные в началеhttpd-vhosts.conf
Wirone

1
@EsaVaremo - httpd.conf будет загружен первым, и в нем будет строка Include, которая содержит источник conf.d / xyz.conf (или, скорее всего, conf.d / *). любая конфигурация (включая vhosts) перед строкой Include будет обработана первой; все, что находится после строки включения, обрабатывается после включенных файлов.
Дэн Притц

7

Не указывайте имя сервера, и оно становится вашим vhost по умолчанию.

<VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>
</VirtualHost> 

Также убедитесь, что вы не указали DocumentRoot в основном файле httpd.conf, так как он будет иметь приоритет над vhosts.


Это первый виртуальный хост в списке, и я все еще получаю «Firefox не может найти сервер».
SJaguar13

2
Я не согласен. У меня был установлен первый виртуальный хост без ServerName, однако, похоже, он конфликтует с некоторыми виртуальными хостами, но не с другими. Я решил проблему, добавив имя_сервера, но установив его в некоторый случайный домен, которого нет на моем сервере. Так как это первый виртуальный хост, он используется по умолчанию, но соответствует только тогда, когда используется домен, не соответствующий ни одному другому ServerName.
Джошайдан

3

Порядок важен - переместите определение vhost для всего остального в начало списка.


2

Используйте виртуальный хост _default_ и поместите его сначала в httpd-vhosts.conf, как указано в http://httpd.apache.org/docs/2.2/vhosts/examples.html.

«Перехват каждого запроса на любой неуказанный IP-адрес и порт, т. Е. Комбинацию адрес / порт, которая не используется ни для какого другого виртуального хоста [...] vhost по умолчанию никогда не обслуживает запрос, который был отправлен на адрес / порт, который является используется для vhosts на основе имен. Если запрос содержал неизвестный заголовок Host: или его отсутствовал, он всегда обслуживается от основного vhost на основе имен (vhost для этого адреса / порта появляется первым в файле конфигурации). "

Фрагмент из живого, но запутанного httpd-vhosts.conf, который блокирует все vhosts для порта 80:

# Listen for virtual host requests on all IP addresses.
# This directive cannot be removed:
NameVirtualHost *:80

<VirtualHost _default_:80>
# This vhost catches client requests with host headers which have
# not been matched by ServerName or ServerAlias directives in other vhosts.
#
# We redirect all such requests to a particular named vhost:
    RewriteCond %{HTTP_HOST}    ^(.*)$
    RewriteRule ^(.*)$  http://my.site.of.choice [R=permanent,L]
</VirtualHost>

# Name based vhosts here:
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName  my.other.site
    ServerAlias my.other.site2 my.other.site3
</VirtualHost>

# more vhosts etc...

Подробное описание процесса сопоставления vhost можно найти здесь: http://httpd.apache.org/docs/2.2/vhosts/details.html.


2
_default_используется только для несопоставленных IP - адресов , поэтому, когда у вас есть подстановочный символ vhost (*: 80), он никогда не будет использоваться.
Wirone

2

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

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>

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


1

Лучшее решение - переименовать файл конфигурации сайта, начиная с «1», чтобы он сначала загрузился, и это будет ваш сайт по умолчанию.

Apache2 делает первый загруженный vhost-файл страницей по умолчанию.


По умолчанию в установке apache также есть 000-defaultвиртуальный хост.
vp_arth

0

при использовании <VirtualHost *:port>и указании ServerName / ServerAlias ​​для хостов, которые вас интересуют, и это то, что мне нужно было сделать.

Немного предыстории в моей ситуации:

У меня есть динамический IP-адрес от моего интернет-провайдера, поэтому мой IP-адрес зарегистрирован в компании, регистрирующей динамический IP-адрес (в моем случае noip.org). Один из моих «хостов» должен был быть зарегистрирован при регистрации DNS как myabc.example.com как CNAME, который указывает на host1.ddns.net. Но host2.ddns.net остался как есть. Я хотел, чтобы myabc.example.com и host1.ddns.net перешли на site1, а host2.ddns.net - на сайт 2, а все остальное, включая мой IP-адрес, - по умолчанию.

Первый чтение конф файл будет по умолчанию, то есть 000_def.conf, 001_site1.conf, 002_site2.confбудет прочитан в таком порядке с , 000_def.confкак сайт по умолчанию. (примечание: в моем случае у меня есть эти «файлы», в /etc/apache2/sites-enabledкоторых на самом деле находятся динамические ссылки на настоящий файл conf в /etc/apache2/sites-available)

Поскольку имя_сервера используется в 001_site1.conf и 002_site2.conf, для него также должно быть установлено значение 000_def.conf.

# 000_def.conf:
<VirtualHost *:80>  
ServerName null
# NOTE: DO NOT USE "ServerAlias *" this seems to override the other conf files.
</VirtualHost>


# 001_site1.conf
<VirtualHost *:80>  
ServerName myabc.example.com
ServerAlias mylocalhostname host1.ddns.net
</VirtualHost>


# 002_site2.conf:
<VirtualHost *:80>  
ServerName host2.ddns.net
</VirtualHost>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.