嘉南整合 · 網域規劃
一句話:整合後的新站點一律開新網域,不寄生在舊站網域底下。
舊網址只在模組搬完後留 301 一段時間,不是長期入口。唯二例外是 ERP 與對外站——
那兩個網址的記憶成本太高,改用同網域路徑分流。
終態網域表
| 目的地 | 網域 | 狀態 | 說明 |
| 對外站 | kngoatmilk.com | 既有 |
www + forms + shop 合併;對客戶的品牌網址,不動 |
| ERP | erp.kng.tw | 既有 |
新殼 erp-next 走 /next 路徑分流,舊 ERP 留原路徑;員工零重新記憶。
同網域=必須嚴守 cookie 分離(不共用 APP_KEY/SESSION_COOKIE、cookie path 分離) |
| 對內站 | office.kng.tw | 新網域 |
客服內勤桌面工作台:電訪名單、報表 93 支+BI、庫存、行政表單、訊息發送。
存量傳統 PHP 頁面日後併入同網域的 legacy 區 |
| └ 人資模組 | office.kng.tw/hr | 已上線 |
Livewire 薪資站(/var/www/salary)。8/17 裁示維持「對內站子路徑、不獨立網域」,
硬隔離靠獨立 app+獨立 session cookie+專屬 DB 帳號 |
| 行動入口 | m.kng.tw | 待建 |
erp-next 的行動區(PWA),外勤用:業務員(吸 sales)+配送員(吸 delivery、kn) |
| LINE 站 | line.kngoatmilk.com | 既有 |
維持獨立,不重構 |
| PBX | pbx.kngoatmilk.com | 既有 |
API only;monitor 頁併進對內站電訪模組 |
命名原則
- 對內用 kng.tw、對外用 kngoatmilk.com——一眼分辨受眾,也讓對內站可以整批套較嚴的存取政策。
- 一個目的地一個網域,模組走路徑(office.kng.tw/hr、/calls、/reports),不再一個功能一個子網域——今天 17 個站的病根就是這個。
- 名字講使用場景不講技術:office(內勤)、m(行動),不用 laravel13/v2/new 這種會過期的字。
- 不用 admin:語意過廣,且是掃描器最愛的字串。
舊網域退場
| 舊網域 | 去處 | 退場方式 |
| salary.kng.tw | office.kng.tw(總務室存量頁面進 legacy 區) | 模組搬完 → 301 → 觀察一個月結 → 撤 |
| call.kng.tw · callhub.kng.tw | office.kng.tw/calls | 同上;⚠️ call 的流量幾乎全是每分鐘健康檢查,判死前先看真人流量 |
| inventory.kng.tw | office.kng.tw/inventory | 同上 |
| invoice.kng.tw | 行政雜項 → office;發票開立 → ERP 帳務域 | 拆兩邊後再撤 |
| sales.kng.tw | m.kng.tw(業務員) | 階段 5 逐頁搬 |
| kn.kng.tw · delivery.kngoatmilk.com | m.kng.tw(配送員) | 功能清空後退役,過渡期照跑 |
| crm.kng.tw | — | 已下架 301 永久留存(LINE 歷史貼圖網址烙死在訊息裡) |
技術契約(每開一個新網域都要照做)
- DNS:Cloudflare 加 A 記錄指 118.163.69.94,Proxy 選 DNS only(比照現有站)。
不開 wildcard A 記錄——會讓任意亂猜的子網域都解析到本機、掉進預設 vhost,等於白送釣魚網址。
- 憑證:2026-08-17 起 kng.tw 全系列改用一張 wildcard
(/etc/letsencrypt/live/kng-wildcard,涵蓋 kng.tw + *.kng.tw,
DNS-01 走 certbot-dns-cloudflare,credentials 在 /root/.secrets/cloudflare.ini)。
新開 kng.tw 子網域不需要再簽憑證,vhost 直接指向該路徑即可。
⚠️ certonly 沒有 installer,續期不會自動 reload——renewal conf 已加
renew_hook = systemctl reload apache2。
kngoatmilk.com 同樣收成一張(kngoatmilk-wildcard,另一組 token
/root/.secrets/cloudflare-kngoatmilk.ini)。
全機憑證因此從 42 張收斂成 3 張(kng-wildcard/kngoatmilk-wildcard/sin-shin.com.tw),
舊憑證已全部 certbot delete。
- Cookie:SESSION_DOMAIN 一律留空(host-only,禁止設 .kng.tw),
每個 app 自己的 SESSION_COOKIE 名稱;同網域路徑分流的(ERP /next、對內站 /hr)
再加 SESSION_PATH 侷限,並且不共用 APP_KEY。
- SSO:跨網域一律票據式——短效、一次性、帶 audience、防 replay、return URL allowlist、不放 query string 長存;
「登出模組」與「登出對內站」分開定義。
⚠️ 9 月算薪驗收前的凍結條款:decision-c2-mount 原訂「驗收前網址/埠全數凍結」。
本次提前搬到 office.kng.tw/hr 是使用者裁示,因此驗收基準網址改為新網址;
:6048 在憑證上線後轉 302 導向,不留第二個可用入口,避免驗收時兩邊資料/session 混淆。
孤兒網域清理(2026-08-17)
⚠️ wildcard 憑證帶出來的新風險,已一併處理。
原本 443 的預設 vhost 是 analysis.kng.tw——任何沒定義 vhost 的網域
(打錯字、舊的孤兒 DNS、外部掃描)打進來都會拿到 analysis 站的內容,而 *.kng.tw
上線後這些請求還一律拿得到有效憑證。已加 000-catchall.conf:
未定義 Host 一律 404(ACME HTTP-01 路徑放行),有 ServerName 的站不受影響。
- 盤點方法:Cloudflare zone 全記錄 × apache2ctl -S 實際 ServerName × DocumentRoot 是否存在 × 全域 grep 活引用。
- 已刪 16 筆孤兒 DNS(站早已刪除、DocumentRoot 不存在、只有 _backups/ 提到):
activity · dv · dv-api · egg · flux · golf · group · order · project · report · skilltree · socool · starmath · test · wakeupgo · linjia。
原記錄備份於 /var/backups/cloudflare-dns-deleted-20260817.json,要回復照著建即可。
- linjia 退役:目錄打包成 /var/backups/linjia-retired-20260817.tar.gz(11MB)後移除。
- 20 個未啟用的 vhost 檔移到 /var/backups/apache-vhosts-retired/。
- 監控修正:sites_registry.php 的 dv/dv_api/flux
三項是假陽性——它們回的 200 其實是 analysis 預設 vhost,站本身早就不存在。已移除。
- 指向其他主機的記錄保留:muxue/video(125)、
chord · crm-test · dv-record · invoice-test · whisper(93)、
sail(外部 Linode)、gamesm(Cloudflare Pages)。
其中 video 回 404、sail 憑證不符,待各自主機的負責人確認。
目前進度
- ✅ office.kng.tw vhost 與骨架首頁已建(/var/www/office/public)
- ✅ 人資掛載 /hr → /var/www/salary/public;登入、六頁、Livewire endpoint、PDF 匯出實測全綠;
cookie 已隔離為 office_hr_session; path=/hr
- ✅ DNS A 記錄、憑證、443、SESSION_SECURE_COOKIE=true 全數完成
- ✅ :6048 已完全移除(vhost 刪除、Listen 6048 拿掉);監控項 salary_lv 改指 office.kng.tw/hr/login
- ✅ *.kng.tw wildcard 憑證上線,42 個 vhost 全部切換、續期 dry-run 通過
(🔴 途中發現 kn/callhub 的 le-ssl 設定在 sites-enabled 是實體檔不是 symlink,
改 sites-available 對它們無效——日後批次改 vhost 都要留意這個漂移)
- ✅ 41 張舊憑證已全數刪除(kng.tw 34+kngoatmilk.com 7);每個 zone 一組 Cloudflare API token,
續期一律 DNS-01 自動化