У меня есть сервер Debian 6, настроенный кем-то другим. Меня попросили добавить поддомен на этом сервере.
Я правильно настроил DNS (проверено с помощью nslookup
), создал каталог в /var/www/
а затем добавил новый виртуальный хост в /etc/apache2/sites-available
(на самом деле я скопировал один из существующих файлов поддоменов и отредактировал его):
<VirtualHost *:80>
DocumentRoot "/var/www/mysub.example.com"
ServerName mysub.example.com
ServerAlias www.mysub.example.com
ErrorLog ...[path to file]
CustomLog [path to file]
RewriteEngine On
#RewriteCond %{HTTP_HOST} ^mysub.example.com$ [NC]
#RewriteRule ^(.*)$ http://www.mysub.example.com$1 [R=301,L]
<Directory /var/www/mysub.example.com>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Затем я добавил свой хост, используя a2ensite
и перезапустил Apache, но домен mysub.example.com
перенаправляется на beta.example.com
который является нашим бета-производственным сайтом. Что странно, конфигурации для beta.example.com
в /etc/apache2/sites-available
.
Что еще мне нужно сделать, чтобы включить этот поддомен? Я почти уверен, что конфигурация для example.com
хост ничего не блокирует, потому что у нас также есть blog.example.com
виртуальный хост настроен таким образом, и он отлично работает.
РЕДАКТИРОВАТЬ
Некоторые результаты отладки:
root@xxx:~# apachectl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:443 beta.example.com (/etc/apache2/sites-enabled/01-example.com:18)
*:80 is a NameVirtualHost
default server beta.example.com (/etc/apache2/sites-enabled/01-example.com:1)
port 80 namevhost beta.example.com (/etc/apache2/sites-enabled/01-example.com:1)
port 80 namevhost blog.example.com (/etc/apache2/sites-enabled/02-blog.example.com:1)
port 80 namevhost [here comes other unrelated domain name]
port 80 namevhost forum.example.com (/etc/apache2/sites-enabled/04-forum.example.com:1)
port 80 namevhost example.com (/etc/apache2/sites-enabled/05-sth.example.com:1)
port 80 namevhost mysub.example.com (/etc/apache2/sites-enabled/06-mysub.example.com:1)
Syntax OK
root@xxx:~# grep -r 'mysub\.example\.com' /etc/apache2
/etc/apache2/apache2.conf:Alias /mysub /var/www/mysub.example.com
/etc/apache2/sites-available/06-mysub.example.com: DocumentRoot "/var/www/mysub.example.com"
/etc/apache2/sites-available/06-mysub.example.com: ServerName mysub.example.com
/etc/apache2/sites-available/06-mysub.example.com: ServerAlias www.mysub.example.com
/etc/apache2/sites-available/06-mysub.example.com: ErrorLog "/var/log/apache2/mysub.example.com-error_log"
/etc/apache2/sites-available/06-mysub.example.com: CustomLog "/var/log/apache2/mysub.example.com-access_log" common
/etc/apache2/sites-available/06-mysub.example.com: #RewriteCond %{HTTP_HOST} ^mysub.example.com$ [NC]
/etc/apache2/sites-available/06-mysub.example.com: #RewriteRule ^(.*)$ http://www.mysub.example.com$1 [R=301,L]
/etc/apache2/sites-available/06-mysub.example.com: <Directory /var/www/mysub.example.com>
root@xxx:~# grep -r 'beta\.example\.com' /etc/apache2
/etc/apache2/sites-available/01-example.com: ServerName beta.example.com
/etc/apache2/sites-available/01-example.com: ServerAlias www.beta.example.com
/etc/apache2/sites-available/01-example.com: ErrorLog "/var/log/apache2/beta.example.com-error_log"
/etc/apache2/sites-available/01-example.com: CustomLog "/var/log/apache2/beta.example.com-access_log" common
/etc/apache2/sites-available/01-example.com: ServerName beta.example.com:443
/etc/apache2/sites-available/01-example.com: ServerAlias www.beta.example.com:443
/etc/apache2/sites-available/01-example.com: ErrorLog "/var/log/apache2/beta.example.com-error_log"
/etc/apache2/sites-available/01-example.com: CustomLog "/var/log/apache2/beta.example.com-access_log" common
РЕДАКТИРОВАТЬ 2 Я сделал быстрый тест. Я отключил первый виртуальный хост (beta.example.com
) с участием:
a2dissite 01-example.com
А затем попытался получить доступ mysub.example.com
и теперь я был перенаправлен на blog.example.com
- который является вторым в порядке включения сайтов. Так похоже mysub.example.com
не найден и попадает в первую корзину *.example.com
найденные поддомены.
РЕДАКТИРОВАТЬ 2
Еще один тест: я изменил порядок моих файлов конфигурации, чтобы мой новый поддомен был первым (по умолчанию). Сейчас:
root@xxx:~# apachectl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:443 beta.example.com (/etc/apache2/sites-enabled/01-example.com:14)
*:80 is a NameVirtualHost
default server mysub.example.com (/etc/apache2/sites-enabled/00-mysub.example.com:1)
port 80 namevhost mysub.example.com (/etc/apache2/sites-enabled/00-mysub.example.com:1)
port 80 namevhost beta.example.com (/etc/apache2/sites-enabled/01-example.com:1)
port 80 namevhost blog.example.com (/etc/apache2/sites-enabled/02-blog.example.com:1)
Syntax OK
И все же, если я попытаюсь войти mysub.example.com
Меня перенаправляют на beta.example.com
. В blog.example.com
по-прежнему отлично работает.
Есть ли вероятность, что конфигурация домена определена где-то еще (помимо /etc/apache2/sites-available
каталог)?
РЕДАКТИРОВАТЬ 3
Дополнительные конфигурации для хостов: beta.example.com и blog.example.com
beta.example.com (файл: /etc/apache2/hosts-available/01-example.com)
<VirtualHost *:80>
DocumentRoot "/var/www/example.com"
ServerName beta.example.com
ServerAlias www.beta.example.com
ErrorLog "/var/log/apache2/beta.example.com-error_log"
CustomLog "/var/log/apache2/beta.example.com-access_log" common
<Directory /var/www/example.com>
AllowOverride All
</Directory>
</VirtualHost>
<VirtualHost *:443>
DocumentRoot "/var/www/example.com"
ServerName beta.example.com:443
ServerAlias www.beta.example.com:443
ErrorLog "/var/log/apache2/beta.example.com-error_log"
CustomLog "/var/log/apache2/beta.example.com-access_log" common
RewriteEngine On
#RewriteCond %{HTTP_HOST} ^example.com$ [NC]
#RewriteRule ^(.*)$ http://www.example.com$1 [R=301,L]
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
<Directory /var/www/example.com>
AllowOverride All
</Directory>
</VirtualHost>
blog.example.com (файл: /etc/apache2/hosts-available/02-blog.example.com)
<VirtualHost *:80>
DocumentRoot "/var/www/blog.example.com"
ServerName blog.example.com
ServerAlias www.blog.example.com
ErrorLog ...[path to file]
CustomLog [path to file]
RewriteEngine On
#RewriteCond %{HTTP_HOST} ^blog.example.com$ [NC]
#RewriteRule ^(.*)$ http://www.blog.example.com$1 [R=301,L]
<Directory /var/www/blog.example.com>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Вы должны проверить файл /etc/apache2/ports.conf
и посмотри на линию NameVirtualHost *:80
возле Listen 80
Если у вас нет этой строки, вы не можете использовать виртуальные хосты на основе ServerName, поэтому нормально, что вы всегда получаете первый включенный виртуальный хост в своем браузере.
Я советую вам отлаживать все ваши файлы, поскольку c4f4t0r сказал, попробуйте "apache2ctl -S", а после этого попробуйте найти правила перезаписи внутри файлов .htaccess, например:
find /var/www/mysub.example.com -name ".htaccess" -exec grep -l -i rewrite {} \;
В вашем основном файле конфигурации есть что-то «опасное»:
<Directory /var/www/mysub.example.com>
AllowOverride All # <---- THIS
Require all granted
</Directory>
Хорошо, проблема (и решение) оказалось довольно простым.
Проблема заключалась в том, что папки вновь созданных поддоменов были пустыми - в них не было файла index.php / html. Таким образом, сервер вместо того, чтобы показывать его (как каталог), был перенаправлен на домен по умолчанию, который был beta.example.com
Итак, конфигурация vhosts была правильной, и после добавления некоторых файлов в папки субдомены начали работать.