一切似乎都正常,但我得到了意外的输入结束:
$TTL 10800
@ IN SOA ns1.riddimdub.com.
admin.radiohost.riddimdub.com. (
1 ; Serial
10800 ; Refresh after 3 hours
3600 ; Retry after 1 hour
604800 ; Expire after 1 week
3600 ) ; Negative caching TTL of 1 day
@ IN NS ns1.riddimdub.com.
@ IN NS ns2.riddimdub.com.
radiohost.riddimdub.com. IN MX 10 radiohost.riddimdub.com.
radiohost.riddimdub.com. IN A 185.40.20.124
ns1 IN A 185.40.20.124
ns2 IN A 185.40.20.124
www IN CNAME radiohost.riddimdub.com.
mail IN A 185.40.20.124
ftp IN CNAME radiohost.riddimdub.com.
我还收到了意外的 RR 类型 10800。
可能是什么问题呢?
答案1
作为人类,我可以将文件的这一部分识别为应有的SOA
记录:
@ IN SOA ns1.riddimdub.com.
admin.radiohost.riddimdub.com. (
1 ; Serial
10800 ; Refresh after 3 hours
3600 ; Retry after 1 hour
604800 ; Expire after 1 week
3600 ) ; Negative caching TTL of 1 day
但如果这些行被正确解析的话,那并不是上述内容的实际含义。
问题
由于主文件格式使用换行符作为记录之间的分隔符*,记录数据的第一个字段后的换行符意味着这应该是记录SOA
:
@ IN SOA ns1.riddimdub.com.
*) 但人们可以发挥想象力,使用括号 ( ( )
) 来以跨越多行的方式格式化单个记录(纯粹是出于风格/人类可读性的原因)。
由于一条SOA
记录必须包含七个记录数据字段,但该假定SOA
记录只有一个字段,因此您会收到“意外输入结束”错误。
(我完全相信原始错误消息也引用了发生这种情况的行号。)
接下来,当本应是记录其余SOA
数据的内容从下一行开始并被视为下一条记录时,您就会遇到二次故障。
您在这里使用了括号,因此整个位被读取为跨多行的单个记录。
那个假定的“下一个记录”被解释如下:
admin.radiohost.riddimdub.com. 1 10800 ...
^ ^ ^
owner name ttl "must be the record type, I guess"?!
这会导致出现“未知 RR 类型 10800”错误消息。
这个错误并不那么重要,只要您修复了第一个问题,它就会消失,这个问题导致一半SOA
记录的内容在错误的上下文中浮动。
修复
有多种编写方法:
最简单(不使用花哨的语法,可能最直观地了解SOA
记录的实际组成):
@ IN SOA ns1.riddimdub.com. admin.radiohost.riddimdub.com. 1 10800 3600 604800 3600
相当常见的多行格式,为注释序列和计时器留出空间:
@ IN SOA ns1.riddimdub.com. admin.radiohost.riddimdub.com. (
1 ; Serial
10800 ; Refresh after 3 hours
3600 ; Retry after 1 hour
604800 ; Expire after 1 week
3600 ) ; Negative caching TTL of 1 hour
另一种选择是,如果你想注释所有内容:
@ IN SOA ns1.riddimdub.com. ( ; Mname (master nameserver)
admin.radiohost.riddimdub.com. ; Rname (email address)
1 ; Serial
10800 ; Refresh after 3 hours
3600 ; Retry after 1 hour
604800 ; Expire after 1 week
3600 ) ; Negative caching TTL of 1 hour
请注意如何在同一行上写记录的字段(编写记录的典型方式),或者必须使用括号来指定如何将记录拆分到多行上。