您不能通过简单地使用 DNS 来做到这一点。当然,您可以将*.foo.biz的 CNAME 记录设置为foo.org,但是当用户在浏览器的地址栏中键入foo.biz时,这不会使浏览器请求foo.org 。您必须在 HTTP 服务器级别使用重定向来实现此目的。
为什么?
为了清楚起见,让我们看一下 stackoverflow.com 的 DNS 设置:
~# dig www.stackoverflow.com
;; QUESTION SECTION:
;www.stackoverflow.com. IN A
;; ANSWER SECTION:
www.stackoverflow.com. 300 IN CNAME stackoverflow.com
stackoverflow.com. 24 IN A 192.252.206.16
正如我们所见,stackoverflow.com 是 www.stackoverflow.com 的规范名称。但是,如果我在浏览器的地址栏中输入 www.stackoverflow.com,它将向 192.252.206.16 发送以下请求:
GET / HTTP/1.1
Host: www.stackoverflow.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
有趣的是,Chrome 可能已经查看了 StackOverflow 的 DNS 配置,并且可能已经看到stackoverflow.com是该服务器的规范名称,但它仍然在标头字段中发送www.stackoverflow.com 。Host
这允许管理员在一台物理机器上托管多个站点(基于名称的虚拟主机)。
但是,192.252.206.16 的服务器响应我的请求
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: http://stackoverflow.com/
Date: Mon, 16 Sep 2013 11:00:43 GMT
Content-Length: 148
<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="http://stackoverflow.com/">here</a></body>
从而将我重定向到 stackoverflow.com。
HTTP 服务器配置
为了实现您的映射,您需要在您的 HTTP 服务器配置中添加一些重写规则。对于 Apache,这可能如下所示:
<VirtualHost *:80>
ServerName foo.biz
ServerAlias *.foo.biz
RewriteEngine On
RewriteCond %{HTTP_HOST} =foo.biz
RewriteRule ^(.*)$ http://foo.org$1 [L,R=301]
RewriteCond %{HTTP_HOST} ^(.*).foo.biz$
RewriteRule ^(.*)$ http://%1.foo.org$1 [L,R=301]
</VirtualHost>
这会将 foo.biz/bar 重写为foo.org/bar并将any.foo.biz/something重写为any.foo.org/something。不过,您仍然需要 foo.biz 的 DNS 条目和 foo.org 站点的站点配置。
希望有帮助...