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.