Apache2将多个主机名重定向到一个

Apache2将多个主机名重定向到一个

我正在尝试将多个主机名重定向到仅一个,例如,如果您输入以下任何一个:

foo.example.com
www.example.com
bar.example.com
eample.com

您必须重定向至www.example.com

我已经安装了一个以www.example.comServerName 为虚拟主机,以 ServerAlias 为其他虚拟主机,并使用 mod_rewrite 来检查主机名是否正确,如果不正确则执行重定向。

问题是,所有内容似乎都是通过 ServerName 指令主机名提供的,因此 mod_rewrite 总是获取www.example.com,这与 apache2 文档一致:

例如,假设您正在为域名 www.domain.tld 提供服务,并且您希望添加指向同一 IP 地址的虚拟主机 www.otherdomain.tld。那么您只需将以下内容添加到 httpd.conf 中:

名称虚拟主机 *:80

<VirtualHost *:80>
服务器名称 www.domain.tld
服务器别名 domain.tld *.domain.tld
文档根目录 /www/domain

<VirtualHost *:80>
服务器名称 www.otherdomain.tld
DocumentRoot /www/otherdomain

您也可以在 NameVirtualHost 和 指令中指定一个显式 IP 地址来代替 *。例如,您可能希望这样做,以便在一个 IP 地址上运行一些基于名称的虚拟主机,并在另一个地址上运行基于 IP 或另一组基于名称的虚拟主机。

许多服务器希望通过多个名称进行访问。使用放置在部分内的 ServerAlias 指令可以实现这一点。例如,在上面的第一个块中,ServerAlias 指令指示列出的名称是人们可以用来查看同一网站的其他名称:

ServerAlias domain.tld *.domain.tld 然后domain.tld 域中所有主机的请求都将由 www.domain.tld 虚拟主机提供服务

是否有任何 apache2 指令可以避免此功能并使用它们匹配的 ServerAlias 的主机名来获取请求服务器?

或者我必须创建另一个虚拟主机仅用于重定向?

谢谢

答案1

说实话,我认为最好的方法是像这样正常设置你的主域:

<VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot /www/domain 
</virtualhost>

然后创建一个新的虚拟主机,它将保存您想要重定向的所有域,如下所示:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias foo.example.com bar.example.com others.example.com
    DocumentRoot /www/redirect_folder 
</virtualhost>

在该文件夹内创建一个简单的 index.php 页面,调用 301,这样其中的任何域名都将使用 301 代码重定向到您的主域名。

<?
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.example.com" );
?> 

您为什么认为这样更好?

这样,每次您有新的域名需要保存并重定向到主域名时,您就不必不断更新一堆地方,并且它不会使用当前名称为您的用户提供服务,但实际上会将他们重定向到您相关的主域名。

如果您是服务器所有者,您可以做得更好,您可以将第二个虚拟主机作为第一个虚拟主机放在 httpd.conf 或 vhost.conf 文件中,这样每当您访问服务器的 IP 时,它都会引导您进入重定向页面,这将引导您的用户进入主域,在这种情况下,您不必设置一堆 ServerAlias,您只需为给定的子域或指向您的 IP 的域创建 DNS A 记录,服务器将处理剩下的事情。

在最后一种情况下,您的虚拟主机所需的一切就是:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /www/redirect_folder 
</virtualhost>

因为您不需要 ServerAlias,因为到达您的服务器 IP 的每个请求都将转到您的第一个虚拟主机。

此外,如果您想使用 .htaccess 来执行此操作,我相信它会是这样的:

RewriteEngine on
rewritecond %{http_host} ^foo.example.com [nc]
rewriterule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

答案2

在这种情况下,一切都取决于配置顺序。

如果你有这样的设置:

<VirtualHost>ServerAlias *.domain.tld</VirtualHost>
<VirtualHost>ServerName subdomain.domain.tld</VirtualHost>

那么人们总是会选择第一个 vhost。但是,如果你像这样定义它们,它就会起作用:

<VirtualHost>ServerName subdomain.domain.tld</VirtualHost>
<VirtualHost>ServerAlias *.domain.tld</VirtualHost>

请记住通配符应始终位于底部。

相关内容