如何使用A记录或CNAME记录将站点A重定向到站点B

46

我有2个主机,我想将一个主机上的子域名指向另一个主机上的子域名:

subdomain.hostone.com --> subdomain.hosttwo.com

我在主机一中添加了一个 CNAME 记录,将其指向 subdomain.hosttwo.com,但是我得到了一个“400 Bad Request”错误。

有人能看出我做错了什么吗?


17
我认为这并不是离题的。DNS配置属于编程领域。 - superluminary
30
@superluminary:“离题”意味着管理员不了解该领域,或者心情不好,或者想要因关闭工单而获得徽章。在这种情况下,我认为这个问题更适合在ServerFault上提问,所以它应该被迁移,而不是关闭。 - SamGoody
2
完全同意,这篇帖子应该重新开放或迁移,DNS配置是横跨两个领域的东西。 - Ben Personick
7个回答

14

试着将它改为"subdomain -> subdomain.hosttwo.com"

CNAME是某个域名的别名,因此当你进入hostone.com的控制面板时,你不需要在CNAME别名中输入整个名称。

至于您遇到的错误,请您能否登录subdomain.hosttwo.com并检查日志?


普通URI重定向和CNAME重定向有什么不同? - Elankeeran
2
@Elankeeran URL 重定向可以附加路径 - CNAMES 只能由完整域名组成。例如,将 URL 重定向子域(例如 www) 到<Protocol> <[SubDomain.]Domain.TLD>[/Path[/...]](例如 https://www.example.com/sites/xyz),而 CNAME 子域(例如 www) 到<[SubDoman.]Domain.TLD>(例如 ghs.google.com)。 - Ujjwal Singh
CNAME是A或AAAA记录的别名,它永远不可能是一个域,而是一个域内或域名内的名称。 - Markus W Mahlberg
@MarkusWMahlberg,你在你的cname下添加了我的建议修改!! - Ali Abbasinasab
@AliAbbasinasab在审核期间对您的编辑进行了一些改进。毕竟,这是关于编辑的,不是吗? - Markus W Mahlberg

11

我认为其中一些答案已经接近了解决您问题的可能方法。

我同意最简单(并且对于SEO来说最好)的解决方法是301重定向。在IIS中,这相当容易完成,您需要创建一个子域名为subdomain.hostone.com的站点,创建站点后,右键单击站点并进入属性。点击打开的站点属性窗口中的“主目录”选项卡。选择“重定向到URL”单选按钮,输入新站点的URL (http://subdomain.hosttwo.com),并选中“上面输入的确切URL”,“永久重定向此资源”复选框(第二个复选框会引起301重定向,而不是302重定向)。然后点击确定,完成操作。

或者,您可以在http://subdomain.hostone.com网站上创建页面,使用以下方法之一(取决于托管平台支持哪种方法):

PHP重定向:


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

ASP重定向:


<%@ Language=VBScript %>
<%
Response.Status="301 Moved Permanently"
Response.AddHeader "Location","http://subdomain.hosttwo.com"
%>

ASP.NET重定向:


<script runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location","http://subdomain.hosttwo.com");
}
</script>

假设您的CNAME记录已正确创建,则您遇到的唯一问题是为http://subdomain.hosttwo.com创建的站点正在使用共享IP和主机标头来确定应显示哪个站点。要在IIS下解决此问题,请在Web服务器上的IIS Manager中右键单击subdomain.hosttwo.com的站点,然后单击“属性”。在显示的“Web Site”选项卡上,您应该看到一个“高级”按钮,旁边有您需要单击的IP地址。在出现的“高级Web Site Identification”窗口上,单击“添加”。选择与subdomain.hosttwo.com已经使用的相同的IP地址,将TCP端口输入80,然后将subdomain.hosttwo.com作为主机标头值输入。点击“确定”,直到回到主IIS管理器窗口,这时就可以了。 打开浏览器,并浏览到http://subdomain.hostone.com,您将看到位于http://subdomain.hosttwo.com的站点,即使您的URL显示http://subdomain.hostone.com

希望这能帮到您...


我非常确定PHP的header()函数是全部小写。 - Austin Adams
2
@UncleNinja:虽然PHP将header()函数定义为全小写(在代码中应该使用这种方式),但是PHP语言在这方面不区分大小写,因此Header()仍然可以正常工作。 - MrWhite
不要忘记添加apache重定向规则Redirect 301 / http://example.com/。可以使用.htaccess实现。 - hitautodestruct
@w3d 只因为它能工作,并不意味着编写不遵循标准的糟糕代码是一个好习惯。从 PHP 手册 中可以看到:"注意:函数名不区分大小写,但通常最好按照它们在声明中出现的方式调用函数。" 我不认识任何有经验的开发者会将函数写成 Header(),因为它确实被定义为 header()。PHP允许您不区分大小写地编写它是另外一回事。 - BadHorsie
1
@BadHorsie 是的,我同意。这也是我认为我说过的话:“PHP将header()函数定义为全小写(在代码中应该使用这种方式)”。我只是说它会“工作”,因为前面的评论似乎暗示它可能不会。在检查代码时,能够快速区分错误和其他“最佳实践”非常有用,这就是我的评论真正想要传达的。 - MrWhite
使用PHP重定向是否是最佳实践? DNS级别可能会稍微快一点,或者我在评估中是错误的吗?与使用DNS ANAME或CNAME相比,还有其他优点吗? CDN会产生任何影响,例如它们是否比PHP重定向更好地缓存DNS等? - Eoin

2
这些天,许多网站所有者正在使用CDN服务从CDN服务器拉取数据。如果这是您的情况,则有两个选择:
  1. 创建子域并通过添加CNAME记录编辑DNS

  2. 不创建子域,但只创建指向临时DNS URL的CNAME记录。

此解决方案仅适用于从CDN中提取代码,这将显示它正在从cdn.sitename.com获取数据,但实际上它正在从您的CDN主机中提取。

2

看起来hosttwo.com的web服务器不允许传递未定义的域名。你还说想要进行重定向,但这并不是一种重定向方法。如果你是通过GoDaddy购买的该域名,你可以考虑使用他们的重定向服务。


更改主机 :) - Eoin

1

你只能将DNS名称指向不同的IP地址,因此如果你正在使用虚拟主机并尝试使用DNS重定向,它是行不通的。

当你在浏览器中输入subdomain.hostone.com时,它会使用DNS获取它的IP地址(如果它是CNAME,则会继续尝试直到从A记录获取IP),然后连接到该IP并发送一个带有

Host: subdomain.hostone.com 

的http请求头。


0

最好/最简单的方法可能是设置一个 301 重定向。无需 DNS 黑客攻击。


0

你可以用许多非 DNS 的方法来实现。 subdomain.hostone.com 的着陆页面可以使用 HTTP 重定向。 hostone.com 上的 Web 服务器可以进行配置以进行重定向(在 Apache 中很容易,但不确定 IIS),等等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接