V2Ray 訂閱格式比較:Base64 訂閱、原生 JSON 與分享連結互轉

比較三種常見訂閱與設定格式,說明互轉方式,以及如何在用戶端確認匯入結果。

本文重點

訂閱網址是取得內容的入口,Base64 是編碼方式,分享連結描述單一連線,而原生 JSON 則可能包含完整的核心執行設定。本文適合需要轉移訂閱、排查匯入失敗或保留自訂設定的使用者:先辨識輸入內容,再依欄位轉換,最後在用戶端檢查連線、傳輸與路由是否完整。

一、先分清網址、編碼與設定內容

「V2Ray 訂閱格式」並非單一的檔案規範。常見訂閱介面會透過 HTTPS 傳回一段文字,內容可能是多條分享連結,也可能是將這些連結整體以 Base64 編碼的結果。訂閱 URL 本身不等於節點設定;用戶端還必須向該網址發出請求並解析回應。

檔名也無法證明內容格式。網址即使以 .json 結尾,也可能傳回錯誤頁面;沒有副檔名的網址也可能傳回有效 JSON。請先查看回應內容,再決定使用「更新訂閱」、「從剪貼簿匯入」或「匯入自訂設定」。

服務提供者提供的相容訂閱

建議

需要持續更新節點時,建議優先使用明確支援目標用戶端的訂閱。常見內容是以 Base64 編碼的分享連結清單,實際格式仍應以服務提供者的說明及回應內容為準。

適用情境:日常更新、多裝置分別匯入、節點位址變更

單條或多條分享連結

vmess://、vless:// 等連結適合轉移單一連線。多條連結通常會逐行排列;連結本身不會自動更新。

適用情境:臨時測試、轉移單一節點、核對連線欄位

原生 JSON 設定

完整設定可以描述入站、出站、DNS 與路由。JSON 只是語法容器,實際欄位必須符合目標核心及其版本;能成功解析,不代表一定能正常執行。

適用情境:固定路由、自訂 DNS、轉移完整執行環境

二、如何辨識及解碼 Base64 訂閱

傳統連結清單訂閱常見的處理方式是:先將每條分享連結各自放在一行,再把整段文字轉成 UTF-8 位元組,最後進行 Base64 編碼。解碼後應能辨認出協定前綴,而不是直接得到完整的核心設定。

3 → 4
標準 Base64 每 3 個位元組編碼為 4 個字元
10808
下方範例中的本機 SOCKS 監聽連接埠
443
下方範例中的遠端 TLS 連線連接埠

以下 JavaScript 僅示範本機字串處理。程式可處理標準 Base64,也相容常見的 URL 安全字元表;移除的是編碼文字中的空白,不是分享連結內的字元。若長度異常或含有非法位元組,請停止檢查,不要反覆解碼試圖「修復」。

function decodeSubscription(encoded) {
  const text = encoded.trim()
    .replace(/\s/g, "")
    .replace(/-/g, "+")
    .replace(/_/g, "/");

  if (!/^[A-Za-z0-9+/]*={0,2}$/.test(text) ||
      text.length % 4 === 1) {
    throw new Error("Base64 文字格式異常");
  }

  const padded = text + "=".repeat((4 - text.length % 4) % 4);
  const bytes = Uint8Array.from(atob(padded), ch => ch.charCodeAt(0));
  return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}

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

三、將分享連結轉成 JSON:依語意對應欄位

轉換連結不只是替換前綴。常見的 VMess 分享格式會將一段 JSON 編碼後放在 vmess:// 之後;VLESS 分享連結則常採用 URI 結構,由使用者識別碼、主機、連接埠、查詢參數與備註組成。不同用戶端對擴充參數的支援可能有所差異。

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

這是用來說明欄位的虛構連線;example.com 是文件中的示範網域,不能用於實際連線。此處的 encryption=none 對應 VLESS 使用者層級的設定,不代表停用 TLS;傳輸安全性由 security=tls 表示。

連結資訊常見的 JSON 對應欄位核對重點
主機與連接埠settings.vnext[].address、port連接埠應為數字,請勿將網域誤填為備註
使用者識別碼settings.vnext[].users[].id完整保留 UUID,不包含 URI 分隔符號
encryption=noneusers[].encryption這是 VLESS 欄位,不可套用至 VMess
security=tlsstreamSettings.security請勿與 VMess 使用者的加密設定混淆
sni=example.comtlsSettings.serverName保留伺服器要求的 TLS 名稱
type=tcpstreamSettings.network傳輸名稱及可接受的別名須依核心版本核對

以下是適用於支援這些欄位的 Xray 核心之結構範例。10808 僅繫結至回環位址,443 是遠端連接埠,兩者不可互換。此處使用傳統的 tcp 寫法;不同核心版本的傳輸命名及相容別名,請以各自文件為準。

{
  "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": "7c9c1f0b-4bd8-4b44-8eb2-3eb2ac702783",
                "encryption": "none"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "serverName": "example.com"
        }
      }
    }
  ]
}

四、將 JSON 轉成分享連結:可能遺失哪些內容

從完整設定匯出分享連結時,轉換工具通常只會擷取一個代理出站。一份 JSON 可能包含多個 outbounds,其中也可能有直連或封鎖出站。轉換前應先選定目標代理的 tag,不能一律把陣列中的第一項當成節點。

轉換方式:分開處理連線轉移與完整設定轉移

只轉移連線
  • 從目標出站擷取協定、伺服器、連接埠與身分欄位。
  • 保留 TLS 名稱、傳輸路徑及伺服器要求的流控設定。
  • 產生分享連結,並在目標用戶端重新設定本機代理與路由。
保留完整行為
  • 保留原生 JSON,並確認目標核心能夠讀取。
  • 核對入站連接埠、DNS、路由規則及外部資料檔案。
  • 使用用戶端的自訂設定匯入入口,確認設定是否遭到改寫。

分享連結適合傳遞連線參數;若要保留完整執行行為,還須一併保留設定檔、相依資源與核心功能。

routing.rules、dns、本機監聽位址及應用程式分流設定,通常不包含在一般節點分享連結中。將 JSON 轉成連結,再由連結轉回 JSON,所得設定不一定與原始檔案相同;即使連線成功,也不代表分流結果一致。

  1. 先備份原始 JSON,並記下要轉移的出站 tag。
  2. 逐項比對伺服器位址、連接埠、身分、傳輸、TLS 與流控設定,不要只比對節點名稱。
  3. 備註與查詢參數須依 URI 規則編碼。請特別留意路徑中的 ?、&、#,避免被誤認為連結分隔符號。
  4. 若轉換工具提示有不支援的欄位,請停止自動轉移並手動核對;不要讓工具默默刪除欄位後繼續使用。

五、將分享連結重新打包成訂閱:不會自動恢復更新

將多條分享連結逐行串接,再對整段文字進行 Base64 編碼,即可得到傳統連結清單訂閱的內容。但這只是一次性的快照。若要讓用戶端定期取得更新,還需要由自己或可信賴的服務提供者管理、且能持續存取的訂閱網址。

原生 JSON 也不能只靠「整份 Base64 編碼一次」就變成所有用戶端通用的訂閱。編碼不會改變內部資料結構。如果目標匯入入口只接受分享連結清單,收到解碼後的完整 JSON 仍可能無法匯入。

六、在 v2rayN 與 v2rayNG 中核對轉換結果

先匯入獨立的測試分組,避免更新訂閱時覆蓋現有手動設定。以下列出常見的操作入口;不同版本的選單排列與文字可能略有不同,請以目前介面為準,也不要將完整 JSON 貼入訂閱 URL 欄位。

  1. v2rayN 訂閱:開啟「訂閱分組」→「訂閱分組設定」,新增測試分組並填入可信的訂閱 URL,再執行該分組的更新指令。
  2. v2rayN 分享連結:複製連結,在主畫面使用「從剪貼簿批次匯入 URL」,並檢查新增項目所屬的分組。
  3. v2rayNG 分享連結:點選右上角「+」→「從剪貼簿匯入」,接著編輯新增項目,核對伺服器、連接埠與傳輸參數。
  4. v2rayNG 訂閱:在選單的「訂閱分組設定」中新增網址,返回後執行「更新訂閱」,確認更新的是測試分組。
  5. 原生 JSON:使用目前版本提供的自訂設定檔匯入入口,先檢查記錄中的設定解析結果,再啟動連線。

啟動後分三個層面檢查:第一,核心能否解析設定並監聽本機連接埠;第二,能否完成遠端交握;第三,應用程式流量是否進入代理並符合預期路由。清單中出現節點,只能證明解析器已儲存資料,不能取代後兩項檢查。

解碼後看得到連結,為什麼還是匯入失敗?

檢查是否把多條連結貼成一行,或連同引號、逗號一起複製。先只匯入其中一條,再確認目標核心是否支援該協定與傳輸方式;單條連結匯入失敗時,重新編碼整份清單也無濟於事。

匯入成功,但啟動時立即顯示連接埠遭占用,該怎麼辦?

檢查自訂 JSON 的 inbounds[].port。如果範例中的 10808 已被其他程序占用,請停止衝突程序或更換連接埠,並同步調整應用程式代理位址。無須因此修改遠端的 443。

轉換後 TLS 交握失敗,需要關閉憑證驗證嗎?

先比對伺服器位址、serverName、系統時間與傳輸設定。檢查轉換工具是否漏掉 SNI 或誤改 TLS 類型;應修正欄位,不要關閉憑證驗證來掩蓋設定不一致。

為什麼節點可以連線,台灣與中國大陸的分流卻變了?

分享連結通常不包含原本的 routing 和 dns。請在目標用戶端重新選擇路由設定,並檢查規則順序與資料檔案;若要重現原始設定,應轉移完整 JSON 並確認核心相容性。

更新訂閱後,手動修改的參數又被改回去了?

訂閱管理中的項目可能會在更新時重新建立。請先將要保留的設定複製到獨立的手動分組,再向服務提供者確認原始訂閱參數。不要將訂閱產生的項目當成長期保存本機修改的地方。

最後請保存三項資料:原始輸入的安全備份、轉換時採用的欄位對應方式,以及目標用戶端中的核對結果。日後發生問題時,才能明確判斷是訂閱回應改變、轉換時遺漏欄位,還是本機路由與連接埠設定遭到變更。

v2rayN / v2rayNG 下載