當我們在Cloudflare設定上去某個網域後,可以將subdomain新增NS紀錄,如我的domain是example.com,可以將a.example.com的NS設定到其他DNS伺服器來管理。
這時候如果想嘗試在subdomain下建立DNS紀錄b.a.example.com,就會跳出錯誤Cannot create a non-glue record that is beneath a delegated child zone. (Code: 89018)。原因也很好理解,你都把subdomain的DNS交出去,新增DNS紀錄也沒意義,所以Cloudflare不讓你新增。

CDN需求
如果你把subdomain的DNS交出去,就沒辦法對subdomain底下的網域進行CDN防護,如果進行防護可以參考以下作法。
我發現一個神奇的機制,當沒有設定a.example.com的NS紀錄的時候,是可以新增b.a.example.com的紀錄,但如果新增NS後就會被擋下來。而且我還發現在新增NS之前設定的b.a.example.com,他的Reverse proxy仍然生效,代表CDN即其他功能都是有效的。
這提供一個解方,當我們需要新增subdomain以下的網域時,可以先刪除NS紀錄,加上新的DNS紀錄後,再加上NS紀錄,之後再把subdomain的DNS設定到Cloudflare IP上就完成了。
Demo
我們可以先建立一個DNS紀錄,當作給下級網域使用CDN的入口,由於Cloudflare同個網域以下所有IP都會是相同的,因此我這邊先建立一個cdn.example.com並開啟Proxy處理,CNAME目標可以隨便不重要。

再來就是刪掉NS紀錄,新增subdomain下的DNS紀錄,再加回去NS紀錄。或是使用我寫的瀏覽器套件,可以自動化完成這一系列動作,套件在此。安裝後到Cloudflare後台,新增或更新DNS紀錄時,都會看到多一個強制儲存的按鈕。輸入完要新增的紀錄,按下強制儲存,就自動完成新增了。

接下來我們只要到b.a.example.com的DNS伺服器設定上CNAME到cdn.example.com,就可以讓流量經過Cloudflare
# DNS recordb.a.example.com CNAME cdn.example.com本機環境測試可以先取得cdn.example.com IP後,設定到本機的hosts檔案,一樣生效,可以用來測試。
# local hosts filex.x.x.x b.a.example.com另外由於Cloudflare預設只提供第一層的SSL憑證*.example.com,要在subdomain下用,要另外購買SSL憑證,如*.a.example.com。
結語
我還是建議subdomain如果要用Cloudflare防護,還是要獨立購買網域,但也可以透過以上方法,將delegated child zone也納入CDN防護。