Kutt 開源短網址工具,把自有網域與點擊統計搬進自己伺服器

Kutt 是可以自架的開源短網址工具,MIT 授權、預設 SQLite 免設定資料庫。本機實測從零裝到第一筆點擊統計:出廠預設是私人服務、統計按小時聚合且不落訪客 IP,自架前該知道的域名易主事件、安全加固現況與 Node 版本陷阱一次看懂。

用 AI 摘要這篇文章:

短網址這門生意,商業服務的分寸一向拿捏得很準:免費方案給你基本轉址,自有網域和完整的點擊統計排在付費牆後面,用得越深付得越多。Kutt 走的是另一條路。這套 2018 年就出現的開源工具(MIT 授權,目前累積 11,112 顆星)把這兩個付費牆功能直接搬進你自己的伺服器:自訂網域、每條連結的點擊統計、密碼保護、到期時間,全部自己管,資料也在自己的資料庫裡。

我在本機把它從零裝到出現第一筆統計,完整走了一圈,也實際測了官方營運的 kutt.to。過程裡最值得先知道的有兩件事:它出廠的預設是私人服務,並不是那種開放所有人上來縮網址的公共站;而且它剛經歷過一次域名易主,上網查資料時要認明現在的官方網址。

舊域名 kutt.it 已經不是官方的了

Kutt 的原始域名是 kutt.it。2026 年 2 月底,專案在 README 掛出公告:這個域名被義大利的域名註冊管理機構停權,理由是沒有依規定提交身分識別文件,開發者先把服務換到新域名 kutt.to,同時聯繫註冊商設法救回舊域名。同年 5 月 14 日結局揭曉,域名已經被別人註冊走,官方把公告升級成正式警告,用加粗字體寫明 kutt.it 已不屬於專案、可能是釣魚站,請所有人改用 kutt.to。

我把兩個域名都實際連線確認過。kutt.to 正常回應,就是官方站;kutt.it 也還活著,連線被 Cloudflare 擋下回 403,背後是誰、在做什麼,從外部看不出來,而這正是官方叫你別碰它的原因。手上有舊的 kutt.it 短連結或書籤的話,把域名換成 kutt.to、後面路徑照舊就能繼續用,官方在公告裡表示舊連結在新域名同樣有效;這點是官方說法,我沒有辦法逐條驗證歷史連結,但至少域名本身要換是確定的。

官方站還有個少被講清楚的限制:它開放匿名建短網址,不用註冊就能用,但匿名連結被蓋上拋棄式的印記。我不帶帳號建了一條測試連結,API 回應裡明確帶著到期時間,是建立後 5 分鐘。有個細節也如實記下:過了戳記時間將近六分鐘我再打它,轉址仍然照常運作,到期清理實際多久生效、什麼條件觸發,從外部看不到。把官方站的匿名連結當成短期拋棄式工具用,是最保險的理解,重要連結別賭它。想要長期連結,在官方站要註冊帳號,或者把整套軟體架到自己機器上。

從零到第一筆統計,我把安裝過程走完整一圈

README 開出來的前提只有一個:Node.js 20 以上。資料庫完全不用煩惱,預設就走 SQLite,一個檔案搞定,Postgres 或 MySQL 想換隨時能換、不換也行,Redis 快取同樣可選。整套程式沒有前端打包步驟,靜態檔案原封不動直接伺服,這是 v3 改版換來的架構,後面講專案狀態時一起說。正式環境唯一必填的環境變數叫 JWT_SECRET,一段用來簽發登入憑證的隨機長字串,其餘全部有預設值。

裝的時候踩到一個值得寫下來的坑。README 只說 Node 20 以上,我在最新的 Node 26 上執行 npm install 直接卡死:預設資料庫驅動 better-sqlite3 這個固定版本沒有對應新 Node 的預編譯檔,退回原始碼編譯又失敗。換到 Node 22 LTS 之後,同一套指令 4 秒裝完 426 個套件,初始化資料庫跑掉 10 個遷移檔,接著啟動。

啟動後看到的第一個畫面不是首頁,是被轉向到建立管理員的頁面,填 email 和密碼就完成,沒有安裝精靈那種層層問答。這一頁只有在資料庫裡還沒有任何帳號時才會出現,之後就換回一般登入頁。

Kutt 首次啟動時的建立管理員帳號頁面Pin
Kutt 首次啟動時的建立管理員帳號頁面

建完帳號登入,首頁就是工作台:一個貼上長網址的輸入框,勾開進階選項能設自訂短址、密碼、描述和到期時間;往下一張表格列著你所有的連結,每列顯示原始網址、建立時間、短網址和瀏覽次數,表格支援搜尋和換頁,每列後面跟著複製、統計、編輯、刪除的快速鍵。

Kutt 登入後的首頁,短網址輸入框與連結清單Pin
Kutt 登入後的首頁,短網址輸入框與連結清單

導覽列上另有管理後台和設定頁。管理後台給管理者看全站的連結與使用者,可以按封鎖狀態、匿名與否、有無綁網域篩選,單獨封鎖某條連結,也能檢視某個使用者名下所有連結,等於內建了最基本的內容管理工具。設定頁則管兩件事:自訂網域的新增移除,以及 API 金鑰的產生,金鑰配上文件齊全的 REST API,就能讓腳本、CI 或其他服務直接建連結、查統計,不必開瀏覽器。

我用它自己的 REST API 建了一條指向 techmoon.xyz 的連結,回應 201,短址是 6 個字元。預設長度就是 6,而且產生器刻意排除了容易看錯的字元,o、0、l、1、i、j 這類都不會出現,這是給人口抄寫留的貼心;短址長度和字母集都可以用環境變數改,要 5 碼、8 碼或只用小寫都行。接著用不帶任何登入狀態的瀏覽器打那條短址,拿到標準的 302 暫時轉址,落點正是我填的目標。API 本身有獨立的文件站,建連結、改連結、查統計、管網域的端點都列在其中,回應格式和我實測拿到的一致,串接前值得先讀過一輪。

密碼保護是認真做的。我另建了一條掛密碼的連結,匿名打開會先看到解鎖頁,填錯密碼畫面直接告訴你密碼不正確,不放行。從原始碼看,密碼用 bcrypt 雜湊後才存進資料庫,比對也是走 bcrypt,不是明碼比對。

Kutt 密碼保護連結的解鎖頁面Pin
Kutt 密碼保護連結的解鎖頁面

寫整合的人要知道一個小坑:自訂短址撞名時,API 回的不是 409 而是 HTTP 500,訊息寫著 Custom URL is already in use。功能上沒問題,但如果你拿狀態碼做錯誤分流,要把 500 當成可預期的業務回應來處理。

出廠預設是私人服務,不是公共縮網址站

把範例設定檔整份讀完,Kutt 的預設值會告訴你它打算給誰用。註冊預設關閉,而且郵件功能預設沒開,郵件不開、註冊也無從談起,第一次啟動建立的那個管理員帳號就是唯一使用者。匿名建連結預設關閉,沒登入的訪客打開首頁會被導去登入頁,看不到任何輸入框,這是我實際用無登入狀態造訪得到的行為。流量限制預設關閉,OpenID Connect 單一登入預設關閉,Redis 預設關閉,要用的時候自己打開。

換句話說,裝好就是一個自己或小團隊專用的短網址服務。團隊情境有留一扇正規的門:內建 OpenID Connect 單一登入,接上公司既有的身分系統後,成員用企業帳號登入,不必在 Kutt 裡另開本地帳號,這比把註冊整個打開安全得多。想開放註冊、讓陌生人來建連結,要自己改環境變數,而且改了之後,速率限制、濫用防制這些本來預設擋住你的風險,就換你自己扛。這個設計取向其實相當誠實:它沒有假裝自己是公共服務,邊界畫得很清楚。反過來說,如果你想要的就是「辦一個給大家用的縮網址站」,Kutt 可以做到,但功課要自己補。

統計怎麼記:每小時一列的聚合,訪客 IP 用完即丟

點擊統計是 Kutt 對決商業服務的主戰場,它的做法從資料表結構就說明了一切。每一條連結的統計以小時為單位分列,同一個小時內的造訪併進同一列:總次數、各瀏覽器的計數、各作業系統的計數,加上國家分布和來源網站兩個 JSON 欄位。訪客的 IP 位址只在當下被拿去做地理查詢,優先讀 Cloudflare 給的國家標頭,沒有就用 GeoIP 資料庫查 IP,查完就丟,統計資料表裡沒有任何 IP 欄位。來源網站只記主機名,而且點號會被替換成別的符號,防止統計欄位被拿來注入。

過濾規則我實測得出來。用無頭瀏覽器造訪短址,瀏覽次數不動如山;換成正常瀏覽器的身分造訪兩次,計數立刻變成 2。原始碼裡的判斷寫得明白:一般轉址路徑會先過機器人過濾,爬蟲的 user agent 不計入,而且只有屬於登入使用者的連結才記錄統計。對統計品質來說這是好事,你的數字不會被各種監測機器人灌水,也不會因為自己反覆測試而虛胖。

轉址用的是 302 暫時轉向,不是 301。差別很實際:瀏覽器會快取 301,訪客第二次點擊根本不經過你的伺服器,統計就跟著漏掉;302 每次都回來問,每次都算到。代價是搜尋引擎權重傳遞的效率不如 301,行銷上若特別在意連結的 SEO 效果,這是要自己衡量的取捨。到期連結的清理也自動化,系統每 30 秒一批,把到期時間過了的連結直接從資料庫刪除。

統計頁本身做得比想像中完整:日、週、月、年四種區間的趨勢圖,來源網站、瀏覽器、作業系統的分布圖,國家分布還配了一張世界地圖。我那條被真實造訪兩次的測試連結,打開統計頁就看得到兩筆記錄長在正確的位置,瀏覽器欄位正確歸類成 Chrome,作業系統歸類成 macOS,來源是 Direct。要在自家網域下看懂每一條外連的流量長相,這個頁面已經夠用。

Kutt 連結統計頁,趨勢圖與來源、瀏覽器、國家分布圖表Pin
Kutt 連結統計頁,趨勢圖與來源、瀏覽器、國家分布圖表

自架前要算進去的現實

安全現況要直接面對。2026 年 8 月,社群裡有人對這套程式碼做了一輪安全檢視,公開列出幾個缺口:helmet 的 CSP 內容安全政策被整個關掉、匿名檢舉表單送出的內容會被原樣放進 HTML 郵件、速率限制只掛在登入註冊這類認證路由上,其他端點沒有。對應的修復 PR 後來關閉了、沒有被合併,我對照目前 v3.2.6 的程式碼,這幾個位置都還維持原樣。檢舉表單是內建的濫用回報管道,訪客回報問題連結,內容會寄到管理者指定的信箱;表單要設了收件信箱才會出現,寄送則靠郵件功能,兩個都設好它才真正動起來。用當然可以用,只是自架要對外開放前得自己補課:在反向代理層加上安全標頭、把速率限制打開、開啟郵件功能前想清楚檢舉表單的風險。自架的好處本來就是這些事你都有權限自己處理。

自訂網域的 HTTPS 是另一件要自己動手的事。自有網域是 Kutt 的招牌功能,設定頁也把流程寫得清楚,把網域的 A 記錄指過來再填表單新增即可。但設定檔裡有一行誠實的註解:自訂網域連結要不要走 HTTPS 的選項預設關閉,憑證要自己想辦法生,至少這個版本是這樣。實務上的意思是,你要在反向代理層用 nginx 或 Caddy 處理憑證,按個開關就全家 HTTPS 這件事在目前的版本裡不存在。

Node 版本的坑看起來最小、卻最容易踩,安裝那段已經提過,這裡給個省事答案:直接用 Docker。官方映像在 Docker Hub 已經被拉超過 543 萬次,一行 docker compose up 起來的就是預設 SQLite 配置,要 Postgres 或 MariaDB 也有現成的 compose 檔換,連 Node 都不用裝。規模的成長路徑也是同一套思路:先用 SQLite 起步,等連結量和查詢量大了再換 Postgres 加上 Redis 快取,環境變數改一改就搬家,資料用資料庫工具轉移。對本來就在自架的人,把它收進既有的 Docker 服務清單 裡一起管理,是阻力最小的起手式。

自架和雲端服務的比較,誰該把短網址搬進自己伺服器

把兩條路線放在一起比較,差異其實集中在幾個固定的面向:

面向雲端服務免費方案Kutt 自架
自有網域多數列為付費功能內建,A 記錄指過來即用
點擊統計免費版通常只有基礎數字完整統計頁,資料在自己資料庫
連結保存服務改政策就可能受影響資料庫自己備份自己搬
維護成本伺服器、更新、憑證都要自己來
安全邊界平台方負責CSP、速率限制要自己補強

最適合的族群輪廓其實很清晰。需要品牌網域的人:行銷文宣上的連結用自己網域,點擊率和信任感都不一樣,這在商業服務上是標準的付費牆。需要長期看數字的人:部落格、電子報、社團經營,每一條外連的點擊趨勢留在自己資料庫,服務停不停、方案改不改都不影響你。已經在自架的人:家裡或公司有 NAS 在跑 Docker 的,多一個容器就是多一個自家服務。要把短網址印成 QR Code 上文宣的人,配合 QR Code 產生工具 就能把固定入口印在紙上,連結背後的目標換了,紙上的碼不用重印。若是只需要顧一條可以隨時換內容的活碼連結,不打算架整套服務,之前介紹過跑在 Cloudflare Workers 上的活碼工具走的是更輕量的路線,兩者的適用規模差很多。

反過來,不建議的場景也一樣清楚。不想管伺服器的人,直接註冊官方 kutt.to 就好,或挑一個商業服務的免費方案,代價是網域和完整統計輪不到你。要開放陌生人大量使用的公共站場景,Kutt 的預設會擋你,你也不該輕易打開,因為濫用防制、速率限制、安全更新這些成本全部落到你身上,而它的安全加固目前還在社群補課階段。

授權與專案狀態

MIT 授權,商用修改再散布都沒有問題,授權條款全文就放在倉庫根目錄。專案 2018 年 2 月建立,目前最新版本 v3.2.6 於 2026 年 7 月 5 日發布,最近的程式提交在 2026 年 9 月 3 日,11,112 顆星、1,511 個 fork、83 個開啟中的議題,維護是活著的,不是棄坑倉庫。發布節奏上,v3.2.3 之後到 2026 年 5 月才出現 v3.2.4 和 v3.2.5,時間正好在域名易主事件後三天,那兩版把整個專案的官方連結從舊域名換到新域名,之後七月再推 v3.2.6。

生態面比多數同類專案完整。官方提供 Chrome 和 Firefox 瀏覽器擴充,ShareX、Alfred、iOS 捷徑都有現成整合,第三方套件涵蓋 C#、Python、Ruby、Rust、Go、Node.js、Java 等語言,還有 Kubernetes 的 Helm chart 可以直接部署進叢集。開發中的方向也看得到需求所在:UTM 參數支援的 PR 還開著,LDAP 登入是社群長期敲碗的議題。

架構本身有個值得記的轉折:v3 把前端從 React 和 Next.js 換成了伺服器渲染的 Handlebars 搭配 htmx,這正是前面說「沒有打包步驟」的來源,官方還為此錄了一支影片講整個遷移過程。對自架者的實際意義是改佈景超簡單,把自己的 CSS、圖片、頁面模板丟進 custom 資料夾就能覆蓋原版,不必學任何前端建置工具。官方甚至維護了一個範例佈景主題倉庫,想換配色或整個換版面都有起點可以抄。這套主題機制不是紙上功能:我自己裝的乾淨實例首頁標題寫的是 Cut your links shorter,而官方 kutt.to 的首頁標題是 Kutt your links shorter,官方站自己就是拿這套機器客製出來的活例子。

Sliven 褚崇名
Sliven 褚崇名

每日分享科技新知、免費資源以及 WordPress、虛擬主機相關主題,任何問題歡迎在科技月球下方留言,或是發送 Email 至 [email protected] 與我聯繫。

文章: 1451

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


Share to...