为了为域和子域声明 VirtualHost,Apache2,Ubuntu

Order to declare VirtualHost for domain and subdomains, Apache2, Ubuntu

我在我的 DNS 中声明了我的 domainsubdomain1subdomain2,一切正常。

然后我像这样创建我的目录: /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 域。

Apache 将尝试将请求的域与它知道的 VirtualHost 之一相匹配。当找不到匹配项时,它将使用它读取的第一个,在配置中从上到下。因此,在这里,您的域未被 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.comhttp://subdomain1.example.com会去第一个VH
  • 类似于子域 2
  • http://www.example.comhttp://example.com会用第三个

这是基于你的问题和你说你尝试过的评论 example.com。在您的配置中,example.com 未在任何地方列出(即 www.example.com != example.com)。