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

alc*_*ado 11 virtualhost redirection serveralias apache-2.2

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

foo.example.com
www.example.com
bar.example.com
eample.com
Run Code Online (Sandbox Code Playgroud)

你必须被重定向到 www.example.com

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

问题是一切似乎都与 ServerName 指令主机名一起提供,所以 mod_rewrite 总是得到www.example.com,这与 apache2 文档一致:

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

名称虚拟主机 *:80

<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain

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

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

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

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

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

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

谢谢

Pri*_*rix 16

老实说,我能看到的最好的方法是,如果您通常像这样设置主域:

<VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot /www/domain 
</virtualhost>
Run Code Online (Sandbox Code Playgroud)

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

<VirtualHost *:80>
    ServerName example.com
    ServerAlias foo.example.com bar.example.com others.example.com
    DocumentRoot /www/redirect_folder 
</virtualhost>
Run Code Online (Sandbox Code Playgroud)

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

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

为什么你认为这种方式更好?

这样你就不必每次有一个新域来保存和重定向到你的主域时不断更新一堆地方,它不会用当前名称为你的用户提供服务,但实际上会将它们重定向到你的主域有问题。

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

在最后一种情况下,您的虚拟主机只需要:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /www/redirect_folder 
</virtualhost>
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • `DocumentRoot /www/redirect_folder` 是个好主意。但为什么不将其替换为“RedirectMatch 301 (.*) http://www.example.com/$1”呢?同样的事情,没有`/www/redirect_folder/index.php`的麻烦。 (2认同)