Вопрос: Apache Default / Catch-All Virtual Host?


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

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


64
2017-11-06 18:36


Источник




Ответы:


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


43
2017-11-06 18:40



Он должен работать, но нет. Если домен не указан конкретно, я понимаю, что «Firefox не может найти сервер». - SJaguar13
Вы установили его как «ServerName host» и «ServerAlias ​​*»? Я не подчеркивал это достаточно изначально, но ServerName не принимает подстановочные знаки, только ServerAlias. ServerName должно быть фактическим именем хоста. - freiheit
Кроме того, работают ли другие виртуальные хосты? Какая версия apache? - freiheit
«Firefox не может найти сервер». не является проблемой apache. Вам нужно более подробно (какой сервер, если с кем-либо связался, что такое код ошибки ...) - Law29


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


73
2018-03-26 23:06



+ 1 миллион инет вам Сэр! Он должен быть первым по умолчанию. - Ryan
Вы знаете, какой из них на первом месте, httpd.conf или conf.d / xyz.conf? - Esa Varemo
+ 2 миллиона интернетов, спасибо вам, сэр. - Ben Everard
«первая загруженная конфигурация виртуального хоста будет по умолчанию» решила мою проблему с локальными доменами SSL на XAMPP (Windows). Похоже, Apache использует первый vhost в качестве значений по умолчанию для каждого порта, поэтому для правильной обработки несогласованных доменов для обоих необеспеченных / защищенных запросов должно быть 2 явных «стандартных» конфигураций для портов 80/443, определенных в начале httpd-vhosts.conf - Wirone
@EsaVaremo - httpd.conf будет загружен первым, и у него будет строка Include, которая будет источником conf.d / xyz.conf (или, вероятно, conf.d / *). любая конфигурация (включая vhosts) до того, как строка Include будет обработана первой; все после того, как строка включения обрабатывается после включенных файлов. - Dan Pritts


Не указывайте имя сервера, и это станет вашим 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.


7
2017-11-07 00:32



У меня это как первый виртуальный хост, и я все равно получаю «Firefox не может найти сервер». - SJaguar13
Я не согласен. У меня был первый набор виртуальных хостов без ServerName, однако он, похоже, конфликтует с некоторыми виртуальными хостами, но не с другими. Я решил проблему, добавив имя_сервера, но установив его в какой-то случайный домен, который не на моем сервере. Поскольку это первый виртуальный хост, он используется как значение по умолчанию, но соответствует только тогда, когда используется домен, не соответствующий любому другому ServerName. - joshaidan


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


3
2017-11-07 01:07





Используйте виртуальный хост _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
2017-11-13 16:03



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


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

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. Или, если у вас есть HTTP-прослушивание на определенных интерфейсах, вам нужно добавить 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>

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


2
2018-05-25 16:50





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

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


1
2017-11-13 11:02



установка по умолчанию apache также имеет 000-default по этой причине. - vp_arth


когда используешь <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 переходили на сайт1 и 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)

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

0
2018-03-06 01:42