Если у меня есть 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. Возможно ли это?
Подстановочный знак включает файлы конфигурации вашего сайта:
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, прослушивающий определенные интерфейсы, вам нужно вместо этого добавить объединение для каждого интерфейса, например:
<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>
Надеюсь, это поможет. Я использую этот метод для загрузки сайтов в указанном мной порядке и предотвращения непреднамеренной загрузки несовпадающих виртуальных хостов на неожиданный сайт.
при использовании
и указании 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>
В дополнение к приведенным здесь ответам (особенно от @Jason Blevins), здесь есть потенциальная ловушка. Мне потребовалось некоторое время, чтобы понять это.
Как уже говорилось, Apache будет использовать первую запись VirtualHost, если никакая другая запись не соответствует либо HostName
, либо HostAlias
].
Однако будьте осторожны при смешивании виртуальных хостов, которые привязаны к определенному IP-адресу, и некоторых, которые не являются (
vs.
).
Если запрос сделан на 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, что может быть неожиданным.
Чтобы решить эту проблему, либо ...
), или Если есть сомнения, запустите apachectl -S
(или любая другая команда, подходящая для вашей системы), чтобы получить список VirtualHosts. Он скажет вам, какой из них используется по умолчанию.