Apache 子域配置不起作用

Apache 子域配置不起作用

我有一台由其他人配置的 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.comblog.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>

答案1

我建议您调试所有文件,正如 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>

答案2

您应该检查文件/etc/apache2/ports.conf并查看NameVirtualHost *:80附近的行Listen 80

如果没有此行,则无法使用基于 ServerName 的虚拟主机,因此在浏览器中始终获得第一个启用的虚拟主机是正常的。

答案3

好的,问题(和解决方案)其实很简单。

问题是新创建的子域的文件夹是空的 - 其中没有 index.php/html 文件。因此,服务器没有将其显示为目录,而是重定向到默认域 -beta.example.com

因此 vhosts 的配置是正确的,并且在向文件夹添加一些文件后,子域名开始工作。

相关内容