Назад | Перейти на главную страницу

Если субдомен не существует

Есть ли способ в apache2 добавить виртуальный хост для несуществующих поддоменов?

Теперь я пробую это:

<VirtualHost *:80>
        ServerAdmin info@devhouse.nl

        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>

        ErrorLog /var/log/apache2/error.log


</VirtualHost>

<VirtualHost *:80>
        ServerAdmin info@devhouse.nl
        ServerName *.devhouse.nl
        DocumentRoot /var/www/errors
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/errors/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

</VirtualHost>

Include sites-available/devhouse.nl.vhost

(второй виртуальный хост)

Но это не работает. Я вижу файл в / var / www, а не в / var / www / errors

Как я могу это исправить?

Если NameVirtualHost *:80 или чего-то подобного еще нет в ваших файлах конфигурации, это должно быть. Это необходимо, когда ваши VirtualHosts используют тот же IP-адрес и порт (как и ваш). Это сообщает Apache, что он должен использовать заголовок Host: в HTTP-запросе, чтобы выбрать, какой VirtualHost должен обрабатывать этот запрос.

У вас также должна быть директива ServerName в каждом VirtualHost, если вы используете NameVirtualHost. Это то, чему Apache сопоставляет заголовок Host :. Директива ServerName не может содержать символ *. Имя сервера должно точно соответствовать вашему домену. Если вы хотите сопоставить www.devhouse.nl и devhouse.nl, вам понадобится директива ServerAlias. Вы можете иметь столько директив ServerAlias, сколько хотите, но только одно ServerName.

ServerName devhouse.nl
ServerAlias www.devhouse.nl
ServerAlias mail.devhouse.nl

VirtualHost с указанным выше будет соответствовать HTTP-запросу, который был отправлен в один из этих трех доменов. Любой другой запрос будет отправлен на VirtualHost по умолчанию.

Первый VirtualHost, указанный в файлах конфигурации, станет VirtualHost по умолчанию. Это тот, который будет обрабатывать запрос, если он не соответствует никакому другому VirtualHost. Если вы хотите, чтобы тот, который вы указали вторым, был по умолчанию, вам придется поменять их местами в файле.

Документация Apache по этому поводу довольно хороша: http://httpd.apache.org/docs/2.2/vhosts/examples.html

Вы можете указать Apache список ваших VirtualHosts и порядок их выполнения с помощью команды apachectl -S (Это заглавная буква S)

В Include в конце выглядит довольно странно. Является ли первая часть списка содержимым включенного файла?

Если все это слишком много, чтобы принять его сразу, вам нужно сделать следующее:

  1. Поменяйте местами два VirtualHosts.
  2. Ставить NameVirtualHost *:80 перед ними обоими.
  3. Избавиться от *. из директивы ServerName или замените его на www. Неважно, что именно входит в VirtualHost по умолчанию, если это домен, которому вы хотите сопоставить.
  4. Добавьте директиву ServerName и, при необходимости, некоторые директивы ServerAlias ​​во второй VirtualHost.

Вы можете создать VirtualHost по умолчанию, который будет запускаться всякий раз, когда не настроен соответствующий NamedVirtualHost. По сути, это будет похоже на первый приведенный вами пример. Затем вы добавляете NamedVirtualHosts для всех доменов, которые хотите обрабатывать (например, добавьте ServerName www.example.com и т.д).

Каждый раз, когда запрашивается виртуальный хост, который не настроен, по умолчанию будет обслуживать этот запрос. При этом вы можете захотеть отобразить определенный контент и / или запустить перенаправление на существующий (или другой) сервер.

Вам может потребоваться объявить NameVirtualHost *:80 до блоков VirtualHost.