V2Ray 訂閱格式完整解析:Base64 訂閱、原生 JSON 與分享連結轉換

解析 Base64 訂閱、完整 JSON 設定與 VMess/VLESS 分享連結的結構差異,說明適用的用戶端及手動轉換方式。

本文重點

先分清訂閱網址、伺服器分享連結與完整設定,再判斷是否能互相轉換。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 節點也已解碼。

3 → 4
Base64 每 3 個位元組對應 4 個字元,不足時會補上填充字元
443
以下 TLS 伺服器連接埠僅為範例,不代表節點固定使用此連接埠
10808
以下為 JSON 本機 SOCKS 監聽設定範例

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));
  1. 先確認內容是否已明文列出協定連結;若是,直接檢查清單即可,不必再次解碼。
  2. 若內容是一整段編碼文字,使用解碼函式拆除外層包裝,再依換行分割並忽略空行。
  3. 檢查每一行的協定前綴。只有確認是傳統 VMess 編碼格式時,才繼續解碼其前綴後的內容。
  4. 若解碼失敗,保留原文並排查內容是否遭截斷、混入網頁內容或發生字元替換;不要把反覆盲目解碼當成修復方式。

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

如何轉換原生 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 範例與 VLESS 連結的欄位對照
JSON 欄位分享連結中的位置範例值
settings.vnext[0].address主機名稱example.com
settings.vnext[0].port遠端連接埠443
settings.vnext[0].users[0].idURI 使用者資訊範例 UUID
streamSettings.securitysecurity 查詢參數tls
tlsSettings.serverNamesni 查詢參數example.com
inbounds[0].port不會寫入伺服器分享連結10808 是本機連接埠

上表中的出站子欄位皆以 outbounds[0] 為基準。手動擷取時,先找出實際使用的代理出站,再讀取該出站的協定與傳輸參數。不要一律選取陣列中的第一項:實際設定的第一項可能是直連出站,也可能包含多個代理出站、鏈式連線或負載平衡選擇。

  1. JSON 轉分享連結:擷取目標出站可表達的欄位,依相應協定的分享格式產生連結;DNS、路由、本機監聽設定與其他出站須另外保存。
  2. 分享連結轉 JSON:先在用戶端匯入節點,由用戶端依目前設定產生核心執行設定;若要手動撰寫,除了遠端欄位,也必須明確設定本機入站與預設出站行為。
  3. 連結清單轉 Base64 訂閱內容:將有效的分享連結逐行串接,再進行一次 UTF-8 Base64 編碼。產生的是訂閱內容,不是可遠端更新的訂閱網址。
  4. Base64 轉完整 JSON:先解碼並辨識內容,再逐一轉換節點。直接把編碼文字放進 outbounds,不符合核心設定格式。

用戶端匯入與轉移:先備份,再以單一節點測試

手動轉換前,先匯出或備份現有設定,並保留原訂閱網址。不要直接覆寫正在使用的訂閱群組;建立測試群組並匯入少量節點,才能分辨是「格式解析失敗」還是「伺服器連線失敗」。以下選單名稱依常見的繁體中文介面描述,實際文字可能隨用戶端版本而異。

轉移方式:分別處理伺服器資訊與本機設定

桌面版:v2rayN
  • 在「訂閱群組」→「訂閱群組設定」新增遠端網址,再更新目標群組。
  • 匯入單一連結時,使用「伺服器」→「從剪貼簿匯入批次 URL」,並先檢查匯入結果。
  • 核對本機監聽連接埠、所選核心與路由設定,不要把遠端的 443 當成本機代理連接埠。
Android 版:v2rayNG/v2flyNG
  • 在訂閱群組設定中新增遠端訂閱;匯入單一連結則使用主畫面的剪貼簿匯入功能。
  • v2rayNG 的參數支援情況依 Xray 核心確認,v2flyNG 則依 V2Fly 核心確認。
  • 重新確認 VPN 授權與應用程式分流設定;這些本機選項不會隨一般節點連結一併轉移。

同一份訂閱可作為兩端共用的來源,但更新時間、協定支援與本機策略仍須分別確認。

匯入後先開啟節點編輯畫面,對照原始內容檢查位址、連接埠、使用者識別資訊、傳輸類型與 TLS 參數,再啟動連線並查看記錄。若清單正常但交握失敗,應檢查連線參數與伺服器狀態;若節點數量為零,則優先排查回應內容與匯入方式,而非先修改路由。

訂閱轉換常見問題:能解碼不代表能連線

Base64 解碼後仍以 vmess 開頭,是不是還沒解完?

這通常是正常的外層訂閱清單。先依行拆分;若是傳統 VMess 連結,再解碼 vmess:// 後面的內容,取得節點 JSON。不要重複解碼整份混合連結清單,否則 URI 標點也會被當成編碼內容處理。

取得 JSON 後,為什麼「從剪貼簿匯入」會顯示找不到伺服器?

先檢查頂層欄位。若包含 inbounds、outbounds,可能是完整的核心設定,應使用目標版本支援的自訂設定匯入方式,或依本文步驟擷取單一代理出站。剪貼簿分享連結匯入功能並非通用 JSON 匯入工具。

轉成 Base64 後,為什麼還是無法匯入用戶端?

先解碼還原原文,確認內容沒有損壞,再檢查每一行是否為目標用戶端支援的協定連結。Base64 只會改變文字表示方式,不會補上缺少的使用者識別資訊、不會將網頁轉成節點,也不會增加核心原本不支援的協定。

轉換後節點可以使用了,為什麼分流規則沒有一起轉過來?

一般分享連結主要描述單一遠端節點,不負責完整轉移 DNS、路由與應用程式分流設定。請回到目標用戶端核對本機策略;若要還原整套路由,應保留原生設定並確認核心欄位相容,不能以節點連線成功就認定設定已完整轉移。

最後依序確認:先確認取得的是正確內容,再確認編碼層次,接著核對節點欄位,最後檢查目標核心與本機流量入口。訂閱、分享連結與原生 JSON 各有用途;只有弄清楚每個步驟會保留或遺失哪些設定,手動轉換時才不會混淆連線問題與設定問題。相關概念可參閱名詞解釋,路由與核心設定則請參閱進階設定。

下載v2rayN