Назад | Перейти на главную страницу

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

Если у меня 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>

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

При использовании виртуальных хостов на основе имен по умолчанию будет загружена первая загруженная конфигурация виртуального хоста (Источник: 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 в виртуальном хосте это неверно. Если хост без ServerName не загружается первым, Apache может даже не использовать его, так как по умолчанию будет загружен первый загруженный хост.

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

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

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

<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.

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

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

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

Фрагмент живого, но запутанного 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...

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

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

Include path/to/site/confs/*httpd.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, прослушивающий определенные интерфейсы, вам нужно вместо этого добавить catchall для каждого интерфейса, например:

<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», чтобы он загружался первым и был вашим сайтом по умолчанию.

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

когда используешь <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-адрес, по умолчанию.

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

Поскольку ServerName используется в 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>

В дополнение к приведенным здесь ответам (особенно от @Jason Blevins) здесь есть потенциальная ловушка. Мне потребовалось время, чтобы понять это.

Как уже говорилось, Apache будет использовать первый Запись VirtualHost, если никакая другая запись не соответствует либо HostName или HostAlias директива.

Однако будьте осторожны при смешивании виртуальных хостов, привязанных к определенному IP-адресу, и некоторых, которые не являются (<VirtualHost 192.168.1.1:80> vs. <VirtualHost *:80>).

Если запрос сделан на IP-адрес, который имеет один или несколько виртуальных хостов, привязанных к IP, он будет использовать первую запись VirtualHost. привязан к этому адресу, даже если это не первый. Другими словами, более конкретные совпадения предпочтительнее неспецифических совпадений по IP-адресу.

пример

<VirtualHost *>
DocumentRoot /www/docs/domain1
ServerName host1.exmple.com
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.1>
DocumentRoot /www/docs/domain2
ServerName host2.exmple.com
ServerAlias host
</VirtualHost>

Если сделан запрос на размещение foobar.example.com, и это разрешается в 192.168.1.1, Apache будет обслуживать из / www / docs / domain2, что может быть неожиданным.

Чтобы решить эту проблему, либо ...

  • сделать все виртуальные хосты независимыми от IP (<VirtualHost *>), или
  • добавьте отдельную запись VirtualHost по умолчанию для каждого обслуживаемого IP-адреса.

Если сомневаетесь, бегите apachectl -S (или любая другая команда, подходящая для вашей системы), чтобы получить список VirtualHosts. Он скажет вам, какой из них используется по умолчанию.