我有一个由其他人configuration的Debian 6服务器。 我被要求在该服务器上添加一个子域名。
我正确地configuration了DNS(用nslookup
检查),在/var/www/
创build了目录,然后添加了新的虚拟主机到/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
正在redirect到beta.example.com
这是我们的testing版生产站点。 奇怪的是, /etc/apache2/sites-available
没有configurationbeta.example.com
。
我还应该做些什么来启用这个子域名? 我很确定example.com
主机的configuration没有阻塞任何东西,因为我们也有一个configuration为这样的blog.example.com
虚拟主机,它工作的很好。
编辑
一些debugging输出:
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我做了一个快速testing。 我禁用了第一个虚拟主机( beta.example.com
):
a2dissite 01-example.com
然后尝试访问mysub.example.com
,我现在被redirect到blog.example.com
– 这是第二个启用网站的顺序。 所以它看起来像mysub.example.com
没有被发现,它落入它find的*.example.com
子域的第一个bin。
编辑2
另一个testing:我改变了我的configuration文件的顺序,以便我的新子域是第一个(默认)。 马上:
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
而且,如果我尝试inputmysub.example.com
我将被redirect到beta.example.com
。 blog.example.com
仍然工作得很好。
是否有机会在其他地方定义域configuration(除/etc/apache2/sites-available
目录之外)?
编辑3
主机的其他configuration: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>
我build议你debugging所有的文件,因为c4f4t0r说试试“apache2ctl -S”,然后尝试在.htaccess文件里面find重写规则,例如:
find /var/www/mysub.example.com -name ".htaccess" -exec grep -l -i rewrite {} \;
在你的主configuration文件中你有一些“危险”的东西:
<Directory /var/www/mysub.example.com> AllowOverride All # <---- THIS Require all granted </Directory>
您应该检查文件/etc/apache2/ports.conf
然后查看Listen 80
附近的NameVirtualHost *:80
行
如果您没有这一行,则不能使用基于ServerName的虚拟主机,因此在浏览器中总是首次启用虚拟主机是正常的。
好的,问题(和解决scheme)出来很简单。
问题是新创build的子域的文件夹是空的 – 它没有index.php / html文件。 所以服务器,而不是显示它(作为目录),redirect到默认域 – 这是beta.example.com
所以虚拟主机的configuration是正确的,并添加一些文件的文件夹后,子域的规定工作。