#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. То, что я предложил здесь, делает именно это. «не работает» — это не вопрос, без подробностей я не могу помочь дальше.