Порядок объявления виртуального хоста для домена и поддоменов, Apache2, Ubuntu

#apache #virtualhost

#apache #virtualhost

Вопрос:

Я объявил в своем DNS, my domain , subdomain1 и subdomain2 , и все работает.

Затем я создаю свои каталоги следующим образом : /var/www/domain.com/public_html/index.html /var/www/subdomain1.domain.com/public_html/index.html /var/www/subdomain2.domain.com/public_html/index.html

Затем я создаю : /etc/apache2/sites-available/domain.conf

 NameVirtualHost *:80

<VirtualHost *:80>
        ServerName www.subdomain1.domain.com
        ServerAlias www.subdomain1.domain.com
        ServerAdmin webmaster@domain.com
        DocumentRoot /var/www/subdomain1.domain.com/public_html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:80>
        ServerName www.subdomain2.domain.com
        ServerAlias www.subdomain2.domain.com
        ServerAdmin webmaster@domain.com
        DocumentRoot /var/www/subdomain2.domain.com/public_html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerName www.domain.com
    ServerAlias www.domain.com
    ServerAdmin webmaster@domain.com
    DocumentRoot /var/www/domain.com/public_html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
  

Я отключаю конфигурацию по умолчанию: sudo a2dissite 000-default.conf

Затем я активирую каждый из веб-сайтов: sudo a2ensite domain.conf

Я перезапускаю Apache 2: sudo systemctl restart apache2.service

Проблема в том, что все ссылки указывают на первый объявленный VirtualHost, даже когда я разделяю объявления VirtualHost в отдельных .conf файлах, это всегда будет первый VirtualHost в каталоге, который будет открыт для всех DNS-доменов.

Комментарии:

1. В адресной строке вашего браузера вы пытаетесь открыть www.subdomain2.domain.com или subdomain2.domain.com ?

2. Да, точно, но когда я пытаюсь открыть domain.com , это всегда первое объявленное VirtualHost , которое будет открыто.

3. Вы не domain.com указали ни в одной из своих ServerName ServerAlias директив or, поэтому будет применен первый VirtualHost.

Ответ №1:

Apache попытается сопоставить запрошенный домен с одним из известных ему виртуальных хостов. Когда он не может найти совпадение, он будет использовать первое, что он прочитал, сверху вниз в конфигурациях. Следовательно, здесь ваши домены не распознаются Apache, и вы все время получаете первый.

Я немного изменил вашу конфигурацию:

 NameVirtualHost *:80

<VirtualHost *:80>
        ServerName www.subdomain1.example.com
        ServerAlias subdomain1.example.com
        ServerAdmin webmaster@example.com
        DocumentRoot /var/www/subdomain1.example.com/public_html

        ErrorLog ${APACHE_LOG_DIR}/sub1_error.log
        CustomLog ${APACHE_LOG_DIR}/sub1_access.log combined
</VirtualHost>

<VirtualHost *:80>
        ServerName www.subdomain2.example.com
        ServerAlias subdomain2.example.com
        ServerAdmin webmaster@example.com
        DocumentRoot /var/www/subdomain2.example.com/public_html

        ErrorLog ${APACHE_LOG_DIR}/sub2_error.log
        CustomLog ${APACHE_LOG_DIR}/sub2_access.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias example.com
    ServerAdmin webmaster@example.com
    DocumentRoot /var/www/example.com/public_html

    ErrorLog ${APACHE_LOG_DIR}/example_error.log
    CustomLog ${APACHE_LOG_DIR}/example_access.log combined
</VirtualHost>
  

Подробные сведения:

  • NameVirtualHost требуется только в том случае, если вы запускаете Apache 2.2.> 2.4, это происходит автоматически, не нужно его ставить, он все равно будет работать.
  • ServerAlias полезно определить другое доменное имя, которое применяется к этому VirtualHost . Если вы определяете ServerAlias == ServerName , это бесполезно.
  • Таким образом, ServerAlias теперь они настроены с доменными именами без «www».
  • Разделите ваши файлы журналов. Если у вас есть 3 VH, указывающие на одни и те же журналы, это будет настоящий беспорядок для отладки. Это упрощает разделение.

Итак, с этой конфигурацией…

  • http://www.subdomain1.example.com и http://subdomain1.example.com перейдет к 1-му VH.
  • Аналогично для поддомена 2
  • И http://www.example.com и http://example.com будет использовать третий.

Это основано на вашем вопросе и комментарии, в котором вы говорите, что пытались example.com . В вашей конфигурации example.com нигде не указан (т.е. www.example.com != example.com ).

Комментарии:

1. Спасибо, но в моем случае я хотел бы иметь несколько веб-сайтов, в том числе один, который указывает на www.subdomain1.example.com , другой, который указывает на www.subdomain2.example.com , и другой, который указывает на « www.example.com «. и эта конфигурация

2. То, что я предложил здесь, делает именно это. «не работает» — это не вопрос, без подробностей я не могу помочь дальше.