Apache переводит меня на один и тот же сайт с разными доменами [дубликат]

Если у меня есть 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. Возможно ли это?

68
задан 6 November 2009 в 20:36
3 ответа

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

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>

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

2
ответ дан 4 January 2021 в 10:04

при использовании и указании 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
ответ дан 4 January 2021 в 10:04

В дополнение к приведенным здесь ответам (особенно от @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, что может быть неожиданным.

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

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

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

0
ответ дан 4 January 2021 в 10:04

Теги

Похожие вопросы