GitHub pages與Cloudflare DNS設定的相關問題與排除

日前在Cloudflare上使用了DNS服務,並將設定套用到Github時出現了在其他品牌的網域名稱服務商上都沒有遭遇過的問題,將問題逐一解析與解法紀錄此備忘與分享。

無法啟動GitHub pages的Enforce HTTPS

Cloudflare DNS與其他域名商不同之處,就是提供了很多隱性的安全防護功能,例如DNS Proxy也是一層不錯的防護,而也正就是這樣的服務讓GitHub pages的設定受到挑戰。

由下圖我們可以看到,有一個CNAME名為some的網域名稱被設定,並且透過Cloudflare DNS Proxy提供服務。

這時候我們去瀏覽這個名為some的GitHub pages網站可以發現,該網站的HTTPS SSL憑證,是由Cloudflare送你的萬用SSL憑證所提供,簽發的組織是Google Trust Services LLC

也就是因為這個原因,GitHub pages的Enforce HTTPS變得無法點選(因為無法簽發SSL)。

可以啟動GitHub pages的Enforce HTTPS

事實上可以發現,在無法點選Enforce HTTPS的狀況下,GitHub pages的網站還是可以透過Cloudflare的萬用SSL憑證提供HTTPS的連接,這是無妨的。但如果你只想要使用GitHub提供的SSL憑證,那麼就要去Cloudflare DNS裡面,把DNS Proxy關閉掉,如下圖。

關閉掉Cloudfalre DNS Proxy後過一陣子,再去GitHub pages網站上面看,就可以發現憑證改成由GitHub簽發的SSL了,簽發的組織是免費的Let's Encrpt

上面所謂的過一陣子,就是要讓GitHub pages有時間去跑自動化申請Let's Encrpt,這段時間有時候很快一兩分鐘就有,有時候可能30分鐘甚至一小時都有可能,如果你遇到還沒有出現憑證的話,可能需要給他一點時間。如果自動化憑證簽發完成後,Enforce HTTPS就會亮起來可以勾選嘍。

小結

還是必須要再強調一次,無論是哪一種憑證都沒有好壞之分,作法上也沒有好壞之分,端看你想要用哪一種組織簽發的憑證。如果你就是想要用Let's Encrpt憑證且開啟Enforce HTTPS功能,那就要把Cloudflare DNS Proxy關閉。

WWW主網站網域名稱問題

假設我在Cloudflare DNS的開啟了一個WWW的域名,且DNS Proxy也關閉了,如下圖所示:

回到GitHub pages會看到NotServedByPagesError錯誤資訊,如下列:

test.com is improperly configured
Domain does not resolve to the GitHub Pages server. For more information, see documentation (NotServedByPagesError).

會形成這樣的原因是因為GitHub沒有辦法拿到test.com的控制權,因此我們必須把頂級網域(Apex domains)交給GitHub。請在Cloudflare這邊下指令把所有的A Records都轉到GitHub的DNS主機。

185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153

完成後過一陣子,再去GitHub的設定畫面,就可以看到一切恢復正常啦!再也看不到黃色的NotServedByPagesError警告方框了。

特別說明

如果你希望採用的是Apex domains作為GitHub Pages的預設網域名稱(例如:text.com),也把上面的四組A Records都轉到GitHub了,這時候你應該還是會看到GitHub Pages還是持續給你跳出www.test.com is improperly configured的黃色警告方框,這代表GitHub仍然希望你把www的使用權交給他。這時候我們就要去DNS服務那邊新增一組CNAME如下,然後默默等候DNS更新即可。

CNAME    www    yourGitHubAccount.github.io.

相關連結

GitHubPages CloudflareDns CloudflareDnsProxy Setting SSL HTTPS EnforceHTTPS NotServedByPagesError