V2Ray 訂閱格式教學:Base64 訂閱、JSON 設定與 vmess:// 分享連結轉換

認識 Base64 訂閱、原生 JSON 與 VMess/VLESS 分享連結,了解格式差異,並學會在 v2rayN、v2rayNG 匯入及轉換。

本文重點

先分清訂閱網址、訂閱回應、單一節點分享連結與核心設定,再選擇正確的匯入方式。本文適合遇到「無法識別訂閱內容」、「不能把 JSON 當成節點匯入」或需要在不同裝置間移轉設定的使用者。依步驟辨識 Base64 外層、了解 VMess 與 VLESS 的欄位差異,並確認轉換時哪些連線參數能保留,哪些 DNS 與路由設定必須另外移轉。

一、辨識格式:訂閱網址不等於節點設定

V2Ray 訂閱並非固定格式的核心設定檔。一般所說的「訂閱連結」通常是 HTTPS 網址;用戶端連線取得文字後,會將內容解析為節點清單。回傳內容可能是逐行排列的分享連結,也可能是將整份連結清單以 Base64 編碼。網址能開啟,只代表成功取得回應,不代表目前的用戶端一定能使用該內容。

項目辨識方式適用入口保存內容
訂閱網址以 https:// 開頭的服務網址訂閱群組設定遠端更新來源
Base64 訂閱內容解碼後通常是多行分享連結由訂閱更新功能解析多個節點的參數
VMess 分享連結vmess:// 加上編碼資料從剪貼簿匯入通常是一個節點
VLESS 分享連結vless:// 加上使用者資訊與查詢參數從剪貼簿匯入通常是一個節點
核心 JSON包含 inbounds、outbounds 等欄位自訂設定入口連線、入口、DNS、路由等設定

例如,https://subscription.example.com/list?token=demo 是網址格式示例,並非可用的訂閱。不要將它當成 VLESS 伺服器網址填入,也不要把原生 JSON 貼到訂閱網址欄位。訂閱網址中的權杖通常與帳號權限相關,排除問題時應遮蔽完整路徑與查詢參數,而不只是隱藏網域名稱。

二、解開 Base64:分清訂閱外層與 VMess 內層

常見的 Base64 訂閱有兩層結構:外層會將整份連結清單編碼;內層的每一條 vmess:// 連結也可能包含一份以 Base64 編碼的 JSON。解開外層後只會得到節點連結,不會直接取得完整的核心執行設定。VLESS 通常使用 URI 結構,不能照搬 VMess 的內層解碼方式。

訂閱回應內容
  ↓ 將整段內容以 Base64 解碼
vmess://一段已編碼的節點 JSON
vless://使用者識別碼@伺服器:連接埠?參數#備註
  ↓ 只解碼 vmess:// 後方的內容
VMess 節點欄位:add、port、id、net、tls 等

先查看回應的實際文字,再決定是否解碼。如果內容已以 vmess:// 或 vless:// 開頭,就按逐行連結處理;如果開頭是 HTML 標籤、登入提示或 JSON 錯誤訊息,問題多半出在訂閱請求、授權或伺服器回傳內容,重複解碼也無法修復。

  • 換行:每一行放一條完整連結。複製時不要在連結中間換行,也不要把多條連結直接接成一行。
  • 字元:Base64URL 使用 -、_ 取代標準 Base64 的 +、/;有些輸出會省略結尾的 =。
  • 文字:中文備註應以 UTF-8 還原;若直接將二進位結果當成一般文字顯示,可能會出現亂碼。
  • 解碼次數:取得連結清單後就停止解碼外層;不要只因為內容看起來是英數混合字串,就繼續重複處理。

以下是可在本機空白頁面中的瀏覽器開發人員工具使用的原生 JavaScript 函式。這段程式只示範文字編碼與解碼,不會發出網路請求,也不會自動讀取剪貼簿。請只用示例文字測試編解碼結果;處理真實訂閱時,也要留意瀏覽器擴充功能與主控台記錄。

function encodeUtf8Base64(text) {
  const bytes = new TextEncoder().encode(text);
  let binary = "";
  for (const byte of bytes) binary += String.fromCharCode(byte);
  return btoa(binary);
}

function decodeUtf8Base64(text) {
  let value = text.trim().replace(/\s+/g, "")
    .replace(/-/g, "+").replace(/_/g, "/");
  if (value.length % 4 === 1) {
    throw new Error("Base64 長度異常,請檢查複製的內容");
  }
  value += "=".repeat((4 - value.length % 4) % 4);
  const bytes = Uint8Array.from(atob(value), ch => ch.charCodeAt(0));
  return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}

const sample = "訂閱格式示例";
console.log(decodeUtf8Base64(encodeUtf8Base64(sample)) === sample);

三、核對節點欄位:VMess JSON 與 VLESS URI

常見的 VMess 分享格式會在 vmess:// 後放入經過編碼的節點描述 JSON。這是用戶端約定的分享格式,不等同於 Xray 或 V2Ray 核心 JSON。以下的 v 是分享格式識別欄位;v: "2" 不是用戶端版本號,也不代表必須安裝特定版本的核心。

{
  "v": "2",
  "ps": "VMess-WS-TLS 範例",
  "add": "node.example.com",
  "port": "443",
  "id": "11111111-2222-4333-8444-555555555555",
  "aid": "0",
  "scy": "auto",
  "net": "ws",
  "type": "none",
  "host": "edge.example.com",
  "path": "/ws",
  "tls": "tls",
  "sni": "edge.example.com"
}

將上述 JSON 完整文字以 UTF-8 編碼成 Base64,再在前方加上 vmess://,即可建立這種分享格式。示例網域與使用者識別碼僅供說明,無法用來連線。真實節點的位址、UUID、傳輸方式與 TLS 設定必須和伺服器端相符,不能只修改備註就拿來使用。

VMess + WS + TLS

伺服器連接埠
443
傳輸欄位
net: ws
請求路徑
/ws
HTTP Host
edge.example.com
TLS SNI
edge.example.com

Host 用於 WebSocket 請求,SNI 用於 TLS 握手;示例中兩者相同,不代表可以互相取代。

VLESS + TCP + TLS

伺服器連接埠
443
傳輸參數
type=tcp
協定參數
encryption=none
傳輸安全性
security=tls
TLS SNI
node.example.com

VLESS 的協定加密欄位與 TLS 所屬層級不同,不能因此移除 TLS 設定。

相應的 VLESS 範例由使用者資訊、位址、查詢參數與片段備註組成。備註含空格或中文時,應進行 URI 百分比編碼;IPv6 位址則需放在方括號內。參數順序通常不影響意義,但參數名稱和值都不能任意修改。

vless://[email protected]:443?encryption=none&security=tls&sni=node.example.com&type=tcp#VLESS-TLS

四、匯入 v2rayN:先新增訂閱群組,再更新節點

遠端訂閱應新增至訂閱群組;單一或多條分享連結則使用剪貼簿匯入。以下依 v2rayN 常見的繁體中文介面說明;桌面版與 WPF 版的入口位置可能不同,更新功能也可能位於群組的右鍵選單。請以實際選單中的同名功能為準,不要因按鈕位置不同就改用自訂設定入口。

  1. 新增群組

    開啟「訂閱群組」→「訂閱群組設定」,新增一筆資料。填寫備註,將完整的 HTTPS 訂閱網址貼到網址欄位,然後儲存。

  2. 更新訂閱

    返回「訂閱群組」,選擇「更新全部訂閱(不透過代理)」。如果目前網路必須透過已可用的代理才能存取訂閱,則選擇相應的透過代理更新選項。

  3. 核對節點

    查看更新結果,確認目標群組中已出現節點。開啟節點編輯視窗,核對協定、伺服器位址、連接埠、傳輸方式與 TLS;不要只憑備註是否相同來判斷。

  4. 選擇伺服器

    在節點清單中按右鍵,選擇「設為作用中伺服器」。更新訂閱只是取得設定,不代表目前的連線已切換至新節點。

  5. 驗證連線

    使用用戶端提供的連線測試功能,再以瀏覽器實際瀏覽需要驗證的網站。如果失敗,先檢查記錄中的握手、驗證或解析錯誤,不要立刻重複轉換格式。

匯入靜態分享連結時,請複製包含前綴的完整連結,然後選擇「伺服器」→「從剪貼簿匯入批次 URL」,常見快捷鍵為 Ctrl+V。批次文字請維持每行一條。若只有 Base64 內容而沒有遠端網址,先在本機還原連結清單,再使用這個入口,較容易找出問題。

  • 再次更新可能覆寫變更:訂閱節點由遠端維護,手動修改的內容可能在下次更新時被取代。需要長期保留的修改,請另存為獨立項目。
  • 請勿照抄本機入口:示例設定常使用 127.0.0.1:10808;實際監聽連接埠應在目前用戶端設定中確認,不能根據訂閱節點的 443 推斷。
  • JSON 請使用專用入口:完整核心設定請使用「伺服器」中的新增自訂設定功能;它與一般節點項目的編輯、匯出功能可能不同。

五、匯入 v2rayNG:保留更新來源,區分靜態複製

v2rayNG 是 Android 上使用 Xray 核心的用戶端。常見介面中,遠端訂閱由右上角選單管理,靜態連結則從主畫面的加號匯入。兩種方式最後都會顯示節點,但只有前者會保留訂閱來源;複製桌面版匯出的分享連結,不會自動帶入桌面版的更新排程或群組關係。

  1. 新增來源

    開啟右上角「⋮」→「訂閱群組設定」,點選「+」,填寫備註與完整訂閱 URL,儲存後返回主畫面。

  2. 取得節點

    開啟「⋮」→「更新訂閱」。如果目前版本提供更新目前群組與更新全部群組兩種選項,請選擇包含目標訂閱的範圍,並查看更新提示。

  3. 匯入靜態項目

    如果取得的是分享連結,請先複製完整文字,再點選主畫面的「+」→「從剪貼簿匯入」。不要連同訂閱網頁的登入說明一起複製。

  4. 啟動並驗證

    選取目標節點、啟動連線,並確認系統顯示的 VPN 授權提示。執行實際連線測試,再以應用程式確認能否存取;只顯示 TCP 延遲,不代表代理請求已成功。

跨裝置移轉方案:共用來源,分別確認設定

桌面版:v2rayN
  • 將原始 HTTPS 網址儲存至訂閱群組。
  • 確認目前的核心支援節點所需協定。
  • 另外設定系統代理、DNS 與路由規則。
Android 版:v2rayNG
  • 新增相同的訂閱網址,不要只複製節點備註。
  • 更新後核對重要參數,並確認節點可用。
  • 另外確認 VPN 授權與個別應用程式的代理範圍。

使用相同來源較方便維護,但回傳清單可能因帳號、請求條件或伺服器策略而異;兩端的清單與設定不會自動同步。

六、執行格式轉換:先確認哪些資訊可以保留

分享連結與 Base64 連結清單之間,通常只是文字包裝格式不同。原生 JSON 與分享連結則無法一對一互換:完整設定可能包含多個出站、直連與封鎖規則、DNS、入口監聽及出站選擇邏輯。一條節點連結通常只能描述某個代理出站的連線參數,無法取代完整設定備份。

保留原始訂閱網址

建議

在兩端分別新增同一個遠端來源。只要網址未變,就能繼續接收遠端維護的節點更新;是否允許多台裝置使用,仍須依服務提供者的帳號規則而定。

適用情境:需要持續更新,並在多台裝置上使用。

匯出節點分享連結

在節點的右鍵選單或分享入口中,選擇匯出分享 URL、複製連結等功能。匯入另一端後逐項核對參數;匯出的內容是靜態節點快照,不包含訂閱權杖或自動更新關係。

適用情境:臨時移轉少數節點,或核對單一連線參數。

保留完整核心 JSON

使用自訂設定入口移轉,並核對核心相容性、本機路徑、監聽位址與連接埠。不要直接將用戶端執行時產生的設定視為可跨平台通用的備份。

適用情境:需要保留多個出站、DNS 或複雜路由設定。

轉換連結清單與 Base64 訂閱內容

  1. 整理目標用戶端支援的完整分享連結,每行一條,並移除聊天記錄中的引號、編號與說明文字。
  2. 將整份文字以 UTF-8 轉換為 Base64,即可取得常見的 Base64 訂閱內容。反向操作只需解碼一次,即可還原逐行排列的連結。
  3. 匯入用戶端前,先確認第一行的協定前綴、總行數與中文備註是否正常。編碼成功不代表每個節點都能連線。
  4. 若要透過 URL 更新,還需要一個實際回傳該內容且由你控管的 HTTPS 服務。產生 Base64 文字本身不會建立訂閱網址。

原生 JSON 與單一節點連結互轉

從 JSON 擷取節點時,先在 outbounds 中找出實際使用的 VMess 或 VLESS 出站,再依所用核心的設定結構讀取伺服器、使用者驗證資料與 streamSettings。不要預設第一個出站就是目標:它可能是直連,也可能是依賴其他出站的鏈式連線。Xray 與 V2Ray 的設定功能及不同版本欄位並不完全相同。

  • 連結轉成 JSON:建議先讓用戶端匯入連結,再由用戶端產生執行設定。如此會一併套用本機入口、DNS 與路由設定,而不是只輸出單獨的出站片段。
  • JSON 轉成連結:只有在該出站的參數能獨立表達時才匯出。如果匯入的是自訂設定,用戶端不一定提供通用的單一節點分享功能。
  • 無法透過連結保留的項目:入口監聽、網域分流、DNS 策略、規則順序與鏈式出站關係,通常不會隨一般分享連結移轉。
  • 轉換後再次核對:比較位址、連接埠、UUID、傳輸方式、路徑、Host、SNI、TLS 或 REALITY 參數,再進行連線測試。

七、排除匯入失敗:依序檢查回應、解析與連線

先確認問題發生在哪個環節。更新訂閱出錯,可能是請求根本沒有成功;顯示「匯入 0 個項目」,可能是文字格式不受支援;節點已出現但無法存取,則應檢查連線參數與代理生效範圍。若把這三類問題混為一談,就可能反覆編碼、切換核心,卻始終沒有修正真正的錯誤。

狀況優先檢查處理方式
更新回應為 401 或 403訂閱權杖、授權狀態與存取條件向服務提供者重新取得有效網址,不要修改 Base64 內容
內容以 HTML 開頭登入頁面、重新導向頁面或請求遭封鎖的頁面檢查最終回應與訂閱入口,不要把網頁原始碼當成節點
Base64 解碼失敗複製內容遭截斷、字元格式不同或缺少補位確認內容完整,將 Base64URL 正規化後再以 UTF-8 解碼
更新成功但匯入 0 個項目確認回傳內容是否為支援的連結清單檢查解碼後的協定前綴,確認伺服器輸出格式
節點存在但握手失敗TLS、SNI、系統時間與傳輸參數逐項核對節點欄位,勿混淆格式問題與連線問題
連線正常但部分應用程式無法使用系統代理、VPN 與個別應用程式規則檢查本機代理接管範圍,不必重新編碼訂閱
為什麼更新訂閱後,節點數量和之前不同?

伺服器可能調整了節點,用戶端也可能篩除不支援或重複的項目。先查看更新記錄與實際回傳內容,再比對協定支援情況。不要只因數量不同就認定轉換時遺失了節點,也不要手動將舊節點重新加入由訂閱自動維護的群組。

JSON 可以成功解析,為什麼用戶端仍然拒絕?

JSON 格式合法只代表語法正確。VMess 分享 JSON、訂閱介面的 JSON 錯誤回應與核心設定都可能通過語法解析,但用途各不相同。還需要確認設定結構、協定支援與入口類型;原生設定應透過自訂設定入口檢查。

只備份分享連結,可以還原 DNS 與路由分流嗎?

通常不行。分享連結主要保存節點連線參數。移轉前也應記錄用戶端的 DNS、系統代理、路由模式與自訂規則,並另外保存完整設定。匯入後先用單一節點測試連線,再還原分流設定,較容易區分是節點還是規則造成問題。

下載v2rayN