Skip to content

域名與 HTTPS 證書

裝好之後最常見的兩件事:換成自己的域名上 HTTPS。再往後是綁多個域名、給分站配泛域名證書。

分站(子域名)要的是泛域名證書,和普通證書的申請方式不一樣,直接看泛域名證書那一節。

一、繫結域名

第 1 步:解析到伺服器

到你買域名的地方(阿里雲、騰訊雲、Cloudflare 等)新增解析:

記錄型別主機記錄記錄值
A@你的伺服器 IP
Awww你的伺服器 IP

@ 是不帶字首的裸域名(abc.com),wwwwww.abc.com。兩條都加,使用者輸哪個都能開啟。

解析生效一般幾分鐘。驗證:

bash
ping abc.com

能 ping 出你的伺服器 IP 就成了(ping 不通但顯示 IP 也算成功,很多伺服器禁 ping)。

第 2 步:在伺服器上繫結

光有 DNS 解析不夠,伺服器也得認這個域名,否則訪問會打到預設站點或直接報錯。

寶塔面板:網站 → 點你的站點 → 域名管理 → 新增 abc.comwww.abc.com

Docker 部署:不用綁域名。映像裡自帶 nginx,域名解析過來就能訪問,證書直接在容器裡申請,見 Docker 怎麼上 HTTPS

二、申請 HTTPS 證書

寶塔(最省事)

網站 → 點你的站點 → SSL → 選 Let's Encrypt → 勾上要簽的域名 → 申請。

簽發成功後,務必開啟「強制 HTTPS」 —— 否則 http:// 還是能訪問,瀏覽器不會自動跳轉。

證書 90 天有效,寶塔會自動續期,不用管。

申請失敗怎麼辦

Let's Encrypt 簽發前會訪問 http://你的域名/.well-known/acme-challenge/xxx 做驗證,這一步失敗就簽不下來:

現象原因
提示驗證失敗 / 404域名還沒解析到這臺伺服器,或解析沒生效
提示連線超時伺服器 80 連接埠沒開(雲伺服器要在安全組裡放行 80)
套了 CDN 後簽不下來先把 CDN 關掉簽完再開,或改用 DNS 驗證
一天內失敗多次後一直失敗Let's Encrypt 有頻率限制,等一小時再試

程式自帶的偽靜態規則已經放行了 .well-known 目錄,不會擋住證書驗證。如果你自己改過偽靜態,注意別把它擋掉,見偽靜態規則

三、Docker 怎麼上 HTTPS

映像裡已經帶了 nginx 和 certbot,證書在容器裡簽,不需要面板、也不用另外起反向代理。

容器同時對映 80 和 443:

bash
docker run -d --name faka -p 80:80 -p 443:443 -v acg_data:/data --restart unless-stopped ghcr.io/lizhipay/acg-faka:latest

一條命令簽好證書(換成你的域名和郵箱):

bash
docker exec faka acg-ssl shop.abc.com [email protected]

再加一條自動續期的定時任務(在宿主機上執行):

bash
(crontab -l 2>/dev/null; echo "0 3 * * * docker exec faka acg-ssl-renew") | crontab -

證書和 nginx 配置都寫在資料卷裡,換映像、重建容器都不會丟。完整說明與排錯見 Docker 安裝

伺服器上已經跑著別的網站、80 被佔用時,才需要用前置反代把容器代理出去;那種情況下不要跑 acg-ssl,證書交給前面那層管。

已經有證書了(Cloudflare 源站證書、買的商業證書)?acg-ssl-import 直接裝進去,不用申請 Let's Encrypt,泛域名也支援 —— 見 Docker 安裝

四、繫結多個域名

一個站點綁多個域名很常見:換了新域名要保留舊的、或者主域名 + 短域名一起用。

先做這一步(兩種部署都一樣):每個域名都在 DNS 解析到同一臺伺服器 IP。

Docker:一條命令就夠了。域名排著寫,最後跟郵箱,它們會簽進同一張證書:

bash
docker exec faka acg-ssl abc.com www.abc.com shop.abc.com [email protected]

以後要加域名,把所有域名一起重新跑一遍 —— 漏掉的會掉出證書。另外只要有一個域名沒解析過來,整張證書就簽不下來。詳見 Docker 安裝

寶塔

  1. 網站 → 站點設定 → 域名管理,把所有域名都加進去
  2. SSL 裡申請證書時,把所有域名都勾上一起簽 —— 一張證書可以覆蓋多個域名,漏掉哪個,那個域名訪問就會報證書錯誤

讓多個域名跳到主域名

多個域名同時能訪問會分散 SEO 權重,通常讓副域名 301 跳到主域名。寶塔裡在偽靜態最前面加:

nginx
if ($host != 'abc.com') {
    return 301 https://abc.com$request_uri;
}

分站功能用到子域名時不要加這條,它會把所有分站域名也跳回主站。

五、泛域名證書(分站必需)

開了分站之後,商家的店鋪地址是 xxx.abc.com。這類子域名是動態的、事先不知道有哪些,普通證書簽不了,必須簽泛域名證書 *.abc.com

和普通證書的區別

普通證書用 HTTP 檔案驗證(訪問 /.well-known/...),泛域名證書只能用 DNS 驗證 —— 需要在域名解析里加一條 TXT 記錄來證明域名是你的。

寶塔怎麼簽

網站 → 站點 → SSL → Let's Encrypt → 驗證方式選 DNS 驗證

  • 如果你的域名在阿里雲/騰訊雲,寶塔支援填 API 金鑰自動加 TXT 記錄並自動續期,強烈建議用這種
  • 手動模式要自己去域名解析里加 TXT 記錄,但每 90 天就要手動加一次,很容易忘了導致全站證書過期

域名要簽的填兩條一起簽:

abc.com
*.abc.com

*.abc.com 不包含 abc.com 本身,必須兩條都簽,否則主站會報證書錯誤。

分站的完整檢查清單

子域名打不開時,按這個順序查(缺一不可):

#檢查項
1後臺 網站設定 → 其他設定 填了主站域名和 DNS-CNAME
2域名解析里加了 * 的泛解析記錄,指向伺服器 IP
3伺服器上繫結了 *.abc.com(寶塔的域名管理里加這一條)——最容易漏
4簽了 *.abc.com 的泛域名證書

詳見分站模組

六、常見問題

瀏覽器顯示「不安全」或證書錯誤 訪問的域名沒被證書覆蓋。檢查申請證書時是不是漏勾了這個域名;子域名要泛域名證書。

裝了證書但 http:// 還能訪問 Docker:acg-ssl 跑完強制跳轉就已經開了,還能進說明證書沒簽成功或 nginx 沒重新載入,重跑一次即可。寶塔:SSL 頁面右上角開啟「強制 HTTPS」。

開了強制 HTTPS 後打不開 / 無限跳轉 用了 CDN 或反代時,回源方式與強制跳轉打架:CDN 回源走 http,站點又強制跳 https,就繞不出來。把 CDN 的回源協議改成 HTTPS,或者把站點這邊的強制跳轉關掉、交給 CDN 做 —— Docker 是 docker exec faka acg-ssl 你的域名 你的郵箱 --no-redirect,寶塔是關掉「強制 HTTPS」。

換域名後前臺圖片、樣式全亂 後臺的站點域名還是舊的。到 網站設定 裡把域名改過來,並清一下模板快取(刪除 runtime/view/compile 目錄下的內容)。

支付回撥失敗 支付平臺後臺配的回撥地址還是舊域名。另外 CDN 防火牆也可能攔截回撥,見網站設定裡的自定義支付回撥域名。

基於 MIT 協議開源