一般情况下,DNS记录类型里用的最多的是A记录、CNAME别名记录、MX邮件记录、PTR反向记录等类型。而且一般来说,DNS里存在的记录就能解析,不存在的记录就不能解析。但有些情况下,希望凡是无法匹配已存在的记录的请求,也能有一个有效的记录返回,即设定一个默认值。比如有一个DNS域usa.com,用户可能试图访问了blabla.usa.com,但这blabla不是系统里已经存在的记录,则一般情况下会DNS查询失败。
但是如果设定了一个默认值,比如将所有已明确定义的记录意外的查询都转向一个IP或CNAME,那么不再有查询失败的错误。处理时可以直接将这类请求转向主站点。这样可以提高用户体验满意度。
方法就是使用DNS通配符。不过由于通配符记录不是明确定义的行业标准,可能在不同的DNS系统上实施起来会有细微的区别。下面仅以BIND 9.5为例。
1. A记录类型:
* IN A 10.10.10.10
所有对不存在的记录的查询会统一得到一个A记录IP地址的返回值。
2. CNAME记录类型:
* IN CNAME default.usa.com.
所有对不存在的记录的查询会统一得到一个CNAME记录的返回,即重定向到default.usa.com,从而获得后者的IP地址(当然也可能有多次CNAME的情况,这里略过)。
通配符类型可以出现在记录项的头部,中部,或尾部。比如可以仅仅是一个*,也可以是*.abc,也可以是a.*.c或a.b.*。例如:
*.sanfrancisco.california IN CNAME default.usa.com.
注意:通配符不会对本域做解析。要实现本域解析,可以添加以下记录:
usa.com. IN A 10.10.10.10
或通过先添加普通A记录再用CNAME的方式:
default IN A 10.10.10.10
usa.com. IN CNAME default
下面略作利弊分析。
利:有利于提高用户体验,不会被DNS解析失败的问题而困扰;对web应用代码中可能出现的一些错误域名也能起到容错作用。
弊:由于通配符并非像A记录等其他类型那样有严格明确的标准,可能在使用过程中(比如跨不同DNS系统的域文件传输/递归解析等)出现某些意料之外的问题。