使用 Apache2 将所有非 www 子域名重定向到主 www 域名

使用 Apache2 将所有非 www 子域名重定向到主 www 域名

我有一个网站(domain.com),我想将我的所有辅助域名(domain2.com、domain3.com)以及这些域名的所有子域名(*.domain.com、*.domain2.com……)重定向到主域名 www.domain.com(因为我希望后者成为访问该网站的唯一 URL)。

以此目的,我创建了一个 Apache 虚拟主机来捕获所有这些可能性并重定向它们(配置我的 DNS 之后,这不言而喻)。我将此配置放在 Apache 的“sites-enabled”文件夹中名为“999-catchall”的文件中。注意:我使用这个名称来确保它是最后检查的 vhost,因为我也有我的默认 vhost(www.domain.com 的 000-default)和我的 webmail 的 vhost(webmail.domain.com 的 001-webmail)。

以下是这个“999-catchall”文件的内容:

<VirtualHost *:80>
        # catch...
        ServerName domain.com
        ServerAlias domain2.com domain3.com *.domain.com *.domain2.com *.domain3.com
        # ...and redirect
        RewriteEngine on
        RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
        RewriteRule ^(.*)$ http://www.domain.com$1 [R=301,L]
</VirtualHost>

此配置适用于 domain.com、domain2.com、*.domain2.com、domain3.com 和 *.domain3.com但不适用于 *.domain.com。例如:如果我输入 blabla.domain2.com,我会被重定向到 www.domain.com,但如果我输入 blaba.domain.com,则不会(我只是出现“未找到服务器”错误)。

我的方法正确吗?你知道我的错误在哪里吗?

编辑:我的错误,我的 DNS 服务器没有为 *.domain.com 正确配置。因此,如果此配置可以帮助那些想要做同样事情的人,那么它就是有效的。

答案1

我不是 Apache 专家,但考虑过改变:

ServerName www.domain.com
ServerAlias domain.com domain2.com domain3.com *.domain.com *.domain2.com *.domain3.com

编辑:重读 OP 后,似乎您已经在另一个文件中配置了 www.domain.com,我认为这是不允许的。但是,这可能是问题的一部分。如果我没有误解,www.domain.com 的响应来自该文件,而不是此处发布的配置。

答案2

我会像这样写 RewriteRule

RewriteRule ^(/.*)$ http://www.domain.com$1 [R=301,L]

确保我不会将随机垃圾邮件附加到 .com 域名

然后启用RewriteLogLevel 3 和 RewriteLog并检查生成的文件是否存在其他错误。

如果您可以将 wget 的输出附加到不起作用的域之一上,这将会有所帮助。

答案3

我不知道您的机器上是否有任何虚拟主机,但请尝试检查 blaba.domain.com 是否尚未在您的配置中的其他地方定义

答案4

注意:我使用这个名称来确保它是最后检查的 vhost,因为我也有我的默认 vhost(www.domain.com 的 000-default)和我的 webmail 的 vhost(webmail.domain.com 的 001-webmail)。

Vhost 配置文件从 0 开始按字母顺序进行检查,第一个文件将作为 catchall。

来自 Apache(1.3 至 2.2)文档:

此列表中的第一个 vhost(配置文件中具有指定 IP 地址的第一个 vhost)具有最高优先级,并捕获对未知服务器名称的任何请求或没有 Host: 标头字段的请求。

您的另一个选择可能是使用_default_:80虚拟主机。请参阅使用_default_ 虚拟主机

相关内容