Apache2多个主机名redirect到一个

我试图redirect多个主机名只有一个,例如,如果你input任何:

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

您必须redirect到www.example.com

我已经安装了一个虚拟主机www.example.com作为ServerName和其他作为ServerAlias,并使用mod_rewrite来检查主机名是否正确,如果不是做redirect。

问题是,一切似乎与服务器名指令主机名,所以mod_rewrite总是得到www.example.com ,这是一致的apache2文档:

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

NameVirtualHost *:80

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

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

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

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

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

有没有任何apache2指令,以避免这个function,并通过它们匹配的ServerAlias的主机名获取请求服务器?

或者我必须创build另一个虚拟主机只是为了redirect?

谢谢

对你来说相当诚实,我能看到的最好的方法就是如果你像这样正常设置你的主域名:

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

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

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

在那个文件夹内build立一个简单的index.php页面来召唤301,所以任何域名都会被301代码redirect到你的主域名。

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

你为什么认为这样更好?

这样,您就不必每次更新一堆地方来更新一个地方,以保留并重新定位到您的主域名,并且不会为您的用户提供当前名称,而是实际上将其redirect到您的主域名有问题。

如果你是服务器所有者,你可以把它变得更好,你可以把第二个虚拟主机作为第一个虚拟主机放在你的httpd.conf文件中,当你点击你的服务器的IP地址时,它会引导你进入redirect页面这将导致您的用户在这种情况下的主要领域,而不是必须设置一堆ServerAlias,你可以创buildDNS A的logging,该给定的子域或域导致您的IP和服务器将负责其余的。

在这最后一种情况下,你所需要的虚拟主机将是:

 <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] 

这一切都取决于这种情况下的configuration顺序。

如果你有这样的设置:

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

人们总是会以第一个鬼来终结。 但是,如果你像这样定义它们,它就可以工作:

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

只要记住通配符应该总是在底部。