Apache за замовчуванням / Catch-All Virtual Host?


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

Також чи працюють інші віртуальні хости? Яка версія апаша?
freiheit

"Firefox не може знайти сервер." - це не проблема апаша. Вам потрібно детальніше (на який сервер, якщо хто-небудь зв’язується, який код помилки ...)
Law29

Дивно, що для мене не працює, він завжди вибирає перший virtualhost незалежно від заголовка хоста
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?
Esa Varemo

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

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

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, але встановивши його на якийсь випадковий домен, який не є на моєму сервері. Оскільки це перший віртуальний хост, він використовується за замовчуванням, але відповідає лише тоді, коли використовується домен, який не відповідає жодному іншому серверу.
Джошайдан

3

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


2

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

"Ловлячи кожен запит на будь-яку не вказану IP-адресу та порт, тобто комбінацію адреси / порту, яка не використовується для будь-якого іншого віртуального хоста [...] vhost за замовчуванням ніколи не обслуговує запит, надісланий на адресу / порт, який є використовується для імен, що базуються на іменах. Якщо запит містив невідомий хост: заголовок, він завжди подається з первинного 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

Впорядкуйте конф-файли вашого сайту, щоб вони завантажувались у очікуваному порядку. Приклад ...

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

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

Apache2 робить перший завантажений файл vhost як сторінку за замовчуванням.


З 000-defaultцієї причини установка apache також має віртуальний хост.
vp_arth

0

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

Трохи передумови в моїй ситуації:

У мене є динамічна IP-адреса від ISP, тому моя 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-адресу, щоб перейти за замовчуванням.

Перший читання конф файл буде за замовчуванням, тобто 000_def.conf, 001_site1.conf, 002_site2.confбуде прочитаний в такому порядку з , 000_def.confяк сайт за замовчуванням. (зауважте: у моєму випадку я маю ці "файли", в /etc/apache2/sites-enabledяких насправді є динамічні посилання на фактичний файл конф /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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.