先分清訂閱網址、伺服器分享連結與完整設定,再判斷是否能互相轉換。Base64 訂閱通常只是多個分享連結的編碼包裝;原生 JSON 還包含本機監聽、DNS 與路由設定,不能只改副檔名就變成訂閱。本文適合遇到「無法辨識訂閱」、「JSON 匯入失敗」或需要跨用戶端轉移設定的使用者,提供本機編碼方式、欄位對照及匯入後的檢查步驟。
先辨識內容:訂閱網址不等於訂閱格式
平常所說的「V2Ray 訂閱」並不是所有用戶端共用的統一檔案標準。以 https:// 開頭的訂閱網址,只代表用戶端需要連線至某個介面;伺服器回傳的內容,才決定它是連結清單、Base64 文字,還是某種設定檔。同一個介面也可能依請求參數或用戶端識別資訊回傳不同內容,因此不能只看網址副檔名判斷是否相容。
| 內容類型 | 常見形式 | 實際儲存的內容 | 適用的匯入方式 |
|---|---|---|---|
| 連結清單訂閱 | 多行協定連結,或一整段 Base64 | 多個伺服器的連線參數 | 訂閱群組與更新功能 |
| 單一分享連結 | vmess:// 或 vless:// | 單一伺服器的連線參數與備註 | 從剪貼簿匯入伺服器 |
| 完整原生 JSON | 包含 inbounds、outbounds 等欄位 | 核心的一整套執行設定 | 與核心相容的自訂設定匯入方式 |
取得訂閱內容時,先確認收到的不是錯誤頁面。若開頭出現網頁標籤、登入提示或「存取已過期」等文字,表示請求沒有取得預期的節點資料。再次將錯誤頁面編碼成 Base64,只會得到編碼後的錯誤頁面,無法修復訂閱。
依用途選擇格式:日常更新與完整設定分開管理
對 v2rayN、v2rayNG、v2flyNG 來說,伺服器清單與執行設定屬於不同層級。用戶端可以依伺服器參數產生核心設定,但完整設定中的本機連接埠與分流策略,不一定能反向轉成分享連結。選擇格式前,先確認要轉移的是「節點」,還是「節點加本機策略」。
用戶端相容的連結清單訂閱
推薦保留遠端訂閱網址,由用戶端定期或手動取得伺服器清單。提供者更新節點時,可透過更新訂閱取得最新內容。
適合:日常管理多個伺服器、需要持續更新節點清單
單一 VMess/VLESS 分享連結
適合匯入單一伺服器,也方便逐項核對連線參數。匯入後通常會成為本機伺服器項目,不會自動保留原訂閱的更新關係。
適合:暫時測試單一節點、手動轉移少量伺服器
與核心相容的完整 JSON
可設定入站、出站、DNS 與路由等項目。請確認目標核心支援相應欄位,不能只看副檔名判斷。
適合:自訂路由、固定本機監聽設定與多出站設定
v2rayNG 使用 Xray 核心,v2flyNG 使用 V2Fly 核心;v2rayN 的實際功能則須視所選核心而定。都是 JSON,不代表設定可以直接通用;都是 VLESS,也不代表所有目標版本都支援相同的傳輸與安全設定。轉換前應以目標用戶端和核心的實際支援範圍為準。
如何解碼 Base64 訂閱:先拆掉外層包裝,再檢查每一行
常見的 Base64 訂閱製作方式,是先用換行串接多個分享連結,再將整段文字編碼。解開外層後,可能會看到 vmess:// 與 vless:// 混合排列。請特別留意:傳統 VMess 分享連結本身還有一層 Base64,因此解開訂閱外層,不代表每個 VMess 節點也已解碼。
Base64 是編碼方式,不是加密。標準編碼常用 +、/ 與結尾的 =;URL 安全變體會改用 -、_,有些輸出也會省略填充字元。中文備註應使用 UTF-8 處理,否則直接轉換字元編碼可能會產生亂碼。
以下函式可在本機瀏覽器空白頁的開發人員工具中使用。它只處理傳入的文字,不會發出網路請求;範例網域、UUID 與連接埠僅用於說明結構,並非可連線的服務。
function decodeBase64Utf8(input) {
let text = input.trim().replace(/\s+/g, "")
.replace(/-/g, "+").replace(/_/g, "/");
if (text.length % 4 === 1) {
throw new Error("Base64 長度無效");
}
text = text.padEnd(Math.ceil(text.length / 4) * 4, "=");
const bytes = Uint8Array.from(atob(text), ch => ch.charCodeAt(0));
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}
function encodeBase64Utf8(input) {
const bytes = new TextEncoder().encode(input);
const binary = Array.from(bytes, byte => String.fromCharCode(byte)).join("");
return btoa(binary);
}
const exampleLink = "vless://[email protected]:443?encryption=none&security=tls&type=tcp&sni=example.com#TLS-demo";
const encodedList = encodeBase64Utf8(exampleLink + "\n");
console.log(decodeBase64Utf8(encodedList));
- 先確認內容是否已明文列出協定連結;若是,直接檢查清單即可,不必再次解碼。
- 若內容是一整段編碼文字,使用解碼函式拆除外層包裝,再依換行分割並忽略空行。
- 檢查每一行的協定前綴。只有確認是傳統 VMess 編碼格式時,才繼續解碼其前綴後的內容。
- 若解碼失敗,保留原文並排查內容是否遭截斷、混入網頁內容或發生字元替換;不要把反覆盲目解碼當成修復方式。
VMess 與 VLESS 分享連結:結構不同,不能只替換前綴
傳統 VMess 連結:JSON 再經 Base64 編碼
常見的傳統 VMess 分享格式,是在 Base64 編碼的節點 JSON 前加上 vmess://。這份節點 JSON 並非完整的核心設定,不包含本機所有入站與路由資訊。以下展示編碼前常見的欄位結構,其中 v 是分享格式的版本識別碼,不是用戶端或核心的版本號。
{
"v": "2",
"ps": "VMess TLS 範例",
"add": "example.com",
"port": "443",
"id": "11111111-1111-4111-8111-111111111111",
"aid": "0",
"scy": "auto",
"net": "tcp",
"type": "none",
"host": "",
"path": "",
"tls": "tls",
"sni": "example.com"
}
將這個物件序列化後,可使用前述編碼函式組成傳統連結:"vmess://" + encodeBase64Utf8(JSON.stringify(node)),其中 node 是上述物件。反向解析時,移除前綴後解碼,再使用 JSON.parse 讀取。此處的 aid: "0" 對應常見的 VMess AEAD 設定,不要因為舊教學而自行改成其他數值。
VLESS 連結:URI 欄位與查詢參數
VLESS 通常直接使用 URI 格式:使用者識別資訊位於 @ 前,伺服器位址與連接埠位於其後,傳輸與安全參數則放在查詢部分,備註放在 # 後。中文備註需要進行百分比編碼;欄位中的特殊字元也應使用 URI 工具正確編碼,不能直接串接未處理的文字。
vless://[email protected]:443?encryption=none&security=tls&type=tcp&sni=example.com#TLS-demo
encryption=none是 VLESS 協定層的設定,不代表停用 TLS;是否啟用 TLS,應由security=tls等設定指定。sni是 TLS 交握時使用的伺服器名稱,不應與 WebSocket 的 HTTP Host 或連線位址混為一談。type=tcp表示範例中的傳輸類型;若改用其他傳輸方式,還需要設定該傳輸所需的參數,且伺服器端也必須支援。- VMess 與 VLESS 的驗證方式及設定結構不同。將
vmess://改成vless://,既不會轉換協定,也不會改變伺服器端設定。
如何轉換原生 JSON:擷取節點,而非保留整套設定行為
完整設定包含「本機如何接收流量」與「流量如何傳送至遠端」兩部分。以下是精簡的 Xray 格式範例:本機只在迴環位址監聽 SOCKS 連接埠,再透過一個 VLESS TLS 出站連線至範例網域。此範例用來說明欄位層級,不包含可用的服務憑證,也不是所有核心通用的設定。
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"tag": "local-socks",
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": true
}
}
],
"outbounds": [
{
"tag": "proxy",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "example.com",
"port": 443,
"users": [
{
"id": "11111111-1111-4111-8111-111111111111",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"serverName": "example.com"
}
}
}
]
}
| JSON 欄位 | 分享連結中的位置 | 範例值 |
|---|---|---|
settings.vnext[0].address | 主機名稱 | example.com |
settings.vnext[0].port | 遠端連接埠 | 443 |
settings.vnext[0].users[0].id | URI 使用者資訊 | 範例 UUID |
streamSettings.security | security 查詢參數 | tls |
tlsSettings.serverName | sni 查詢參數 | example.com |
inbounds[0].port | 不會寫入伺服器分享連結 | 10808 是本機連接埠 |
上表中的出站子欄位皆以 outbounds[0] 為基準。手動擷取時,先找出實際使用的代理出站,再讀取該出站的協定與傳輸參數。不要一律選取陣列中的第一項:實際設定的第一項可能是直連出站,也可能包含多個代理出站、鏈式連線或負載平衡選擇。
- JSON 轉分享連結:擷取目標出站可表達的欄位,依相應協定的分享格式產生連結;DNS、路由、本機監聽設定與其他出站須另外保存。
- 分享連結轉 JSON:先在用戶端匯入節點,由用戶端依目前設定產生核心執行設定;若要手動撰寫,除了遠端欄位,也必須明確設定本機入站與預設出站行為。
- 連結清單轉 Base64 訂閱內容:將有效的分享連結逐行串接,再進行一次 UTF-8 Base64 編碼。產生的是訂閱內容,不是可遠端更新的訂閱網址。
- Base64 轉完整 JSON:先解碼並辨識內容,再逐一轉換節點。直接把編碼文字放進
outbounds,不符合核心設定格式。
用戶端匯入與轉移:先備份,再以單一節點測試
手動轉換前,先匯出或備份現有設定,並保留原訂閱網址。不要直接覆寫正在使用的訂閱群組;建立測試群組並匯入少量節點,才能分辨是「格式解析失敗」還是「伺服器連線失敗」。以下選單名稱依常見的繁體中文介面描述,實際文字可能隨用戶端版本而異。
轉移方式:分別處理伺服器資訊與本機設定
桌面版:v2rayN
- 在「訂閱群組」→「訂閱群組設定」新增遠端網址,再更新目標群組。
- 匯入單一連結時,使用「伺服器」→「從剪貼簿匯入批次 URL」,並先檢查匯入結果。
- 核對本機監聽連接埠、所選核心與路由設定,不要把遠端的 443 當成本機代理連接埠。
Android 版:v2rayNG/v2flyNG
- 在訂閱群組設定中新增遠端訂閱;匯入單一連結則使用主畫面的剪貼簿匯入功能。
- v2rayNG 的參數支援情況依 Xray 核心確認,v2flyNG 則依 V2Fly 核心確認。
- 重新確認 VPN 授權與應用程式分流設定;這些本機選項不會隨一般節點連結一併轉移。
同一份訂閱可作為兩端共用的來源,但更新時間、協定支援與本機策略仍須分別確認。
匯入後先開啟節點編輯畫面,對照原始內容檢查位址、連接埠、使用者識別資訊、傳輸類型與 TLS 參數,再啟動連線並查看記錄。若清單正常但交握失敗,應檢查連線參數與伺服器狀態;若節點數量為零,則優先排查回應內容與匯入方式,而非先修改路由。
- 本機連線:使用系統代理或手動指定代理的應用程式,應連線至用戶端實際監聽的位址與連接埠。範例中的
127.0.0.1:10808不適用於所有安裝環境。 - 遠端連線:連線逾時、驗證失敗與 TLS 名稱不符是不同問題,應依據記錄分別排查,不要一次修改所有欄位。
- 更新關係:從剪貼簿匯入的靜態節點,不一定會隨原訂閱網址更新;若需要自動更新,應保留訂閱網址及其所屬群組。
訂閱轉換常見問題:能解碼不代表能連線
Base64 解碼後仍以 vmess 開頭,是不是還沒解完?
這通常是正常的外層訂閱清單。先依行拆分;若是傳統 VMess 連結,再解碼 vmess:// 後面的內容,取得節點 JSON。不要重複解碼整份混合連結清單,否則 URI 標點也會被當成編碼內容處理。
取得 JSON 後,為什麼「從剪貼簿匯入」會顯示找不到伺服器?
先檢查頂層欄位。若包含 inbounds、outbounds,可能是完整的核心設定,應使用目標版本支援的自訂設定匯入方式,或依本文步驟擷取單一代理出站。剪貼簿分享連結匯入功能並非通用 JSON 匯入工具。
轉成 Base64 後,為什麼還是無法匯入用戶端?
先解碼還原原文,確認內容沒有損壞,再檢查每一行是否為目標用戶端支援的協定連結。Base64 只會改變文字表示方式,不會補上缺少的使用者識別資訊、不會將網頁轉成節點,也不會增加核心原本不支援的協定。
轉換後節點可以使用了,為什麼分流規則沒有一起轉過來?
一般分享連結主要描述單一遠端節點,不負責完整轉移 DNS、路由與應用程式分流設定。請回到目標用戶端核對本機策略;若要還原整套路由,應保留原生設定並確認核心欄位相容,不能以節點連線成功就認定設定已完整轉移。
最後依序確認:先確認取得的是正確內容,再確認編碼層次,接著核對節點欄位,最後檢查目標核心與本機流量入口。訂閱、分享連結與原生 JSON 各有用途;只有弄清楚每個步驟會保留或遺失哪些設定,手動轉換時才不會混淆連線問題與設定問題。相關概念可參閱名詞解釋,路由與核心設定則請參閱進階設定。