Apache - 添加通配符和子域虚拟主机

Apache - 添加通配符和子域虚拟主机

我正在尝试在我的服务器上设置两个虚拟主机,以便所有子域名都应转到 Dir1,而一个特定子域名应转到 Dir2。

基本上,我想用这两个

  1. *.domain.com > Dir1
  2. special.domain.com > Dir2

我的配置文件中有以下两个虚拟主机条目

<VirtualHost *:80>

    ServerName special.domain.com
    ServerAlias special.domain.com
    DocumentRoot /var/www/html/Dir2
</VirtualHost>

<VirtualHost *:80>

    ServerName www.domain.com
    ServerAlias *.domain.com
    DocumentRoot /var/www/html/Dir1
</VirtualHost>

现在的问题是通配符域名可以正常工作……但是 special.domain.com 也转到 Dir1 而不是 Dir2。

知道我这里遗漏了什么吗?

答案1

这是因为,一旦 Apache 读取组合配置文件,指令的顺序就会发生变化。

Apache 将使用它找到的第一个匹配的站点 ServerName 或 ServerAlias,因此如果您的通配符主机首先出现在配置文件中,那么 Apache 将使用该主机进行匹配,并且永远不会看到特殊配置(因为 special.domain.com 也匹配 *.domain.com)。因此 - 您需要确保首先加载和解析 special.domain.com conf 文件,以便 Apache 将其选为第一个匹配项。只有未进行第一次匹配的站点才会“失败”并改为匹配 *.domain.com。

在 Ubuntu、Debian 或其他基于 Debian 的系统上,这些文件位于 /etc/apache2/sites-enabled 中(这些文件实际上是指向 /etc/apache2/sites-available 中实际 .conf 文件的符号链接)。Apache 将按字母顺序读取该目录中的文件,因此您可以通过将其链接重命名为“001-something.conf”而不是“something.conf”来强制首先读取文件。Debian 默认使用此技巧 - 它将默认网站设置为“001-default.conf”(链接到 ../sites-available/default.conf)。这会导致默认虚拟主机首先加载,因此如果后面没有匹配项,它就是您看到的虚拟主机。就像您可以将 conf 文件命名为 001-something.conf 一样,您也可以将其命名为:ZZ-something.conf 以使其最后加载。在所有这些情况下,您都在重命名 /etc/apache2/sites-enabled 中的文件(而不是 /etc/apache2/sites-available)。

在 Redhat / Centos / Fedora 下,您可以将 vhosts 合并到一个配置文件中。如果您的环境是那样,那么只需按照以下说明重新排序它们,直到它们正常工作即可。

要修复您的问题,请尝试重命名 /etc/apache2/sites-available 中的 conf 文件,以便您的通配符站点最后加载(将其重命名为以 ZZ- 开头)。或者,如果您确定它已经最后加载,请尝试使其首先加载(将其重命名为以 001 或 002- 或其他名称开头)。其中一个应该可以修复它,并且它会按预期运行。

答案2

对于这么多的信息,我想说这都是关于调试和挖掘的。

https://stackoverflow.com/a/758383/10477798我可以说这确实会起作用,已经检查过了。

ServerAlias在您的 special.domain.com 部分中是不需要的并且不正确,所以让我们尝试删除它。

<VirtualHost *:80>
    ServerName special.domain.com
    DocumentRoot /var/www/html/Dir2
</VirtualHost>

<VirtualHost *:80>
    ServerName www.domain.com
    ServerAlias *.domain.com
    DocumentRoot /var/www/html/Dir1
</VirtualHost>

有人说“虚拟主机的名称以相同的顺序无动于衷地列出”,从头到尾,检查一下。

如需更多信息,您可能需要指定:

  1. 您的 Apache 版本
  2. 您是直接访问 special.domain.com 还是通过任何重定向访问
  3. 和往常一样,访问日志和错误日志中有什么内容
  4. 您将这个配置放在哪里,它们是一起还是分开的

继续...

相关内容