我正在尝试在我的服务器上设置两个虚拟主机,以便所有子域名都应转到 Dir1,而一个特定子域名应转到 Dir2。
基本上,我想用这两个
- *.domain.com > Dir1
- 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>
有人说“虚拟主机的名称以相同的顺序无动于衷地列出”,从头到尾,检查一下。
如需更多信息,您可能需要指定:
- 您的 Apache 版本
- 您是直接访问 special.domain.com 还是通过任何重定向访问
- 和往常一样,访问日志和错误日志中有什么内容
- 您将这个配置放在哪里,它们是一起还是分开的
继续...