不同的子域名,apache 使用相同的 vhost 响应

不同的子域名,apache 使用相同的 vhost 响应

我在 Digital Ocean 有一个 VPS,运行 ubuntu 14.04 和 apache 2.4.7,DNS 也在 DO 中管理。

我有一个域名,我们称之为 thedomain.com,我一直在尝试与主域名一起配置 3 个子域名(thedomain.com、calis.thedomain.com、orlybg.thedomain.com、fubar.thedomain.com)。

我无法正确配置我的 apache 的虚拟主机,在浏览器中无论配置到哪个域/子域,我总是得到相同 vhost 的响应(我可以通过 apache 日志知道)和浏览器中的输出。

主域名和 3 个子域名是 A 记录 www 是 CNAME,这是我的区域文件:

$ORIGIN thedomain.com.
$TTL 1800
thedomain.com. IN SOA ns1.digitalocean.com. hostmaster.thedomain.com. 1422028092 10800 3600 604800 1800
thedomain.com. 1800 IN NS ns1.digitalocean.com.
thedomain.com. 1800 IN NS ns2.digitalocean.com.
thedomain.com. 1800 IN NS ns3.digitalocean.com.
thedomain.com. 1800 IN A 104.236.80.93
www.thedomain.com. 1800 IN CNAME thedomain.com.
orlybg.thedomain.com. 1800 IN A XXX.XXX.XX.XX
fubar.thedomain.com. 1800 IN A XXX.XXX.XX.XX
calis.thedomain.com. 1800 IN A XXX.XXX.XX.XX

我有主主机和 3 个子域作为 4 个独立的虚拟主机文件,我已启用以下 3 个:

calis.thedomain.com.conf

<VirtualHost *:80>
    ServerName calis.thedomain.com


    DocumentRoot /var/www/html/calis
    <Directory /var/www/html/calis>
        # enable the .htaccess rewrites
        AllowOverride All
        Require all granted

    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error_calis.log
    CustomLog ${APACHE_LOG_DIR}/access_calis.log combined

</VirtualHost>

域名.com.conf

<VirtualHost *:80>
    ServerName thedomain.com


    DocumentRoot /var/www/html/thedomain
    <Directory /var/www/html/thedomain>
        # enable the .htaccess rewrites
        AllowOverride All
        Require all granted

    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

orlybg.thedomain.com.conf

<VirtualHost *:80>
    ServerName orlybg.thedomain.com

    DocumentRoot /var/www/html/myproject
    <Directory /var/www/html/myproject>
        # enable the .htaccess rewrites
        AllowOverride All
        Require all granted

    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error_orlybg.log
    CustomLog ${APACHE_LOG_DIR}/access_orlybg.log combined

</VirtualHost>

我使用 a2ensite 启用 vhosts,启用了 vhost_alias.load,用多种方式重启/重新加载 apache,但都失败了。我发现 NameVirtualHost 指令未在我的 apache 版本中使用,我以前有一个带有 ServerName localhost 的 conf 文件,因此看不到“无法可靠地确定服务器的完全限定域名”错误,但我禁用了它。

apachectl -S

VirtualHost configuration:
*:80                   is a NameVirtualHost
     default server calis.thedomain.com (/etc/apache2/sites-enabled/calis.thedomain.com.conf:1)
     port 80 namevhost calis.thedomain.com (/etc/apache2/sites-enabled/calis.thedomain.com.conf:1)
     port 80 namevhost thedomain.com (/etc/apache2/sites-enabled/thedomain.com.conf:1)
     port 80 namevhost orlybg.thedomain.com (/etc/apache2/sites-enabled/orlybg.thedomain.com.conf:1)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex default: dir="/var/lock/apache2" mechanism=fcntl
Mutex mpm-accept: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33

我不知道下一步该怎么做,我已经尝试了好几天了。如果能得到任何帮助我都会非常感激,谢谢!

答案1

除了这个问题我还有两点建议

  1. 添加ServerNameApache 为请求提供服务的主机的 FQDN。这将帮助您避免很多麻烦。
  2. 如果所有子域都有不同的 IP 地址,则使用基于 IP 的虚拟化而不是基于名称的虚拟化。

您的VirtualHost配置看起来很完美,而且似乎不会产生问题。

Apache 文档指出

如果在包含最具体的匹配 IP 地址和端口组合的虚拟主机集合中未找到匹配的 ServerName 或 ServerAlias,则将使用匹配的第一个列出的虚拟主机。

通常,VirtualHost会根据Host:HTTP 标头选择不同的部分,如果没有与标头VirtualHost匹配的部分Host:,则第一个部分将被视为默认部分,并将被提供。而这又取决于您在浏览器中发出请求的方式。您可以使用curl命令检查它,以确定是什么导致了问题,如下所示。

$ curl -L http://localhost -H 'Host: thedomain.com'

这应该返回来自的文档/var/www/html/thedomain

$ curl -L http://localhost -H 'Host: orlybg.thedomain.com'

这应该返回来自的文档/var/www/html/myproject

这里-H我们可以选择发送自定义 http 标头,因此这里我们使用它来发送Host:http 标头。

答案2

最后,我的一个朋友发现我在 vhosts 中输入了错误,于是他在 /etc/hosts 中添加了一些包含域名和服务器 IP 的条目

thedomain.com        XXX.XXX.XX.XX
www.thedomain.com    XXX.XXX.XX.XX
orlybg.thedomain.com XXX.XXX.XX.XX
calis.thedomain.com  XXX.XXX.XX.XX

相关内容