本文重點

訂閱網址是更新入口,Base64 是編碼方式,分享連結描述單一節點,核心 JSON 則可描述整套執行設定。本文適合遇到「瀏覽器打得開,客戶端卻無法匯入」的使用者:先辨認內容,再選擇 v2rayN 或 v2rayNG 的匯入入口,最後確認轉換是否會遺失路由、DNS 或傳輸參數。

一、訂閱網址、Base64 與 JSON 屬於不同層次

「V2Ray 訂閱」並非由副檔名決定的單一格式。常見流程是:客戶端連線至 HTTPS 網址、取得文字、解析其中的節點,再寫入自己的設定清單。網址負責取得與更新,實際的解析方式則取決於回應本文。因此,網址結尾沒有副檔名,或附有 .txt,都不足以判斷是否能匯入。

訂閱網址與節點清單

推薦

常見的回應內容是逐行排列的分享連結,或是將整份連結文字進行一次 Base64 編碼。保留訂閱入口,之後才能重新取得更新後的節點。

適用情境:需要在多台裝置上持續更新伺服器清單。

單一分享連結

可透過 vmess://、vless:// 等前綴辨識協定,通常包含單一節點的連線參數。匯入後通常只是一次性的副本,不會自動取得訂閱更新功能。

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

核心原生 JSON

可包含入站、出站、DNS、路由與記錄設定。這是指定核心的設定檔,不等同於圖形客戶端的節點清單,也不是客戶端資料備份。

適用情境:需要保留多個出站、特殊路由或完整核心設定。

Base64 不提供加密保護。訂閱權杖與節點識別資訊即使轉成一長串字元,仍然可以還原。請勿將完整訂閱內容提交至公開的轉換網站,也不要在求助截圖中顯示網址的查詢參數。

二、vmess:// 與 vless:// 的結構差異

常見的 VMess 分享格式是在 vmess:// 後接上以 Base64 編碼的 JSON 物件。這個物件常見 add、port、id、net、tls 等欄位,但它只是分享格式中的節點描述,並非可直接交由 Xray 啟動的完整設定。

檢查項目常見 VMess 分享格式常見 VLESS 分享格式
主要結構協定前綴後接 Base64 JSONURI 使用者資訊、主機、連接埠與查詢參數
節點識別資訊JSON 中的 idURI 中 @ 前的使用者資訊
傳輸方式常見欄位 net常見查詢參數 type
TLS 與服務名稱常見欄位 tls、sni常見參數 security、sni
備註常見欄位 ps# 後的片段,通常經過百分比編碼

VLESS 連結通常不是「將整條連結再解碼一次 Base64」。參數也可能包含 flow、fp、pbk、sid,分別與流控、指紋及 REALITY 參數有關。具體名稱與支援範圍取決於客戶端版本,不能只憑協定前綴就認定所有參數都受支援。

三、如何解碼 Base64 訂閱?為什麼有時需要分兩層解析

假設回應本文是「多條 VMess 連結組成的文字,再整份進行 Base64 編碼」。第一層解碼後會得到逐行排列的連結;每條 vmess:// 後的載荷仍需另外解碼,才能看到節點欄位。這是兩層包裝疊加的結果,並非所有訂閱都一定要解碼兩次。

  1. 先檢查原始內容。若逐行文字已經以 vmess:// 或 vless:// 開頭,就不需要整份解碼。
  2. 如果看起來是 Base64 文字,再嘗試解碼一次,並確認結果是否為連結清單。
  3. 如果解碼後出現網頁標籤、登入提示或錯誤訊息,請回到取得內容的步驟處理,並停止格式轉換。
  4. 若結果是 JSON,請檢查欄位結構。JSON 陣列、核心設定與服務介面回傳值,不能只因語法有效就互相替代。

以下是用於離線處理文字的原生 JavaScript 函式,只進行編碼與解碼,不會發出網路請求。函式支援常見的 Base64URL 字元,並以 UTF-8 處理中文備註。請在可信任的本機環境使用,不要將真實內容貼到不熟悉網頁的主控台。

function decodeBase64Text(source) {
  const normalized = source.trim()
    .replace(/\s+/g, "")
    .replace(/-/g, "+")
    .replace(/_/g, "/");
  const padded = normalized.padEnd(
    Math.ceil(normalized.length / 4) * 4, "="
  );
  const bytes = Uint8Array.from(
    atob(padded), char => char.charCodeAt(0)
  );
  return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}

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

判斷方式:先確認解碼結果,再選擇匯入入口

結果是逐行排列的分享連結,就依節點清單處理;若包含 inbounds、outbounds 等執行設定欄位,則進一步核對核心設定結構。反覆編碼無法修復錯誤回應,也不能補上缺少的協定參數。

四、v2rayN 與 v2rayNG 分別要從哪裡匯入

圖形客戶端通常會分開管理「伺服器節點」、「訂閱群組」與「自訂完整設定」。一般節點匯入工具負責辨識分享連結;訂閱設定用來儲存更新網址;自訂設定入口則用於完整 JSON。不要把這三種內容全都貼進訂閱網址欄位。

匯入方式:依內容選擇桌面版或 Android 版入口

桌面版:v2rayN
  • 單條或多條分享連結:複製後選擇「伺服器」→「從剪貼簿匯入批次 URL」。
  • 訂閱網址:前往「訂閱群組」→「訂閱群組設定」新增 URL,再執行更新訂閱。
  • 完整 JSON:在「伺服器」選單中尋找自訂設定伺服器入口,並選擇符合設定檔的核心。
Android 版:v2rayNG
  • 分享連結:點選右上角「+」→「從剪貼簿匯入」。
  • 訂閱網址:開啟側邊選單中的「訂閱群組設定」,新增群組與 URL,返回清單後執行「更新訂閱」。
  • 完整 JSON:使用「+」選單中的自訂設定匯入項目,不要當成一般節點連結匯入。

以上是常見的介面文字,不同版本可能略有差異;請以目前選單中的剪貼簿、訂閱群組與自訂設定功能為準。

v2rayNG 使用 Xray 核心,v2flyNG 使用 V2Fly 核心。某份 JSON 能在 v2rayNG 執行,不代表換成 v2flyNG 後也能照原樣運作。尤其涉及 REALITY、特定傳輸設定或核心專用欄位時,應先確認目標核心的支援範圍。

五、三種格式如何互相轉換?哪些資訊無法保留?

分享連結與 Base64 訂閱之間的轉換,通常只會改變外層包裝:將多條完整連結以換行串接,再以 UTF-8 進行 Base64 編碼,就能得到常見的靜態訂閱本文。但只有本文還不算可更新的訂閱服務;客戶端仍需取得本文的網址,以及後續維護內容的機制。

轉換方向操作方式主要限制
Base64 訂閱 → 分享連結整份解碼一次,保留每條連結與換行無法從本文還原原訂閱權杖、更新週期或介面回應標頭
分享連結 → Base64 本文每行放一條完整連結,以 UTF-8 編碼後整份轉為 Base64靜態內容不會自動隨原訂閱更新
分享連結 → 核心 JSON解析協定、安全層與傳輸參數,產生對應的出站設定還需設定入站、路由、DNS 等執行環境
完整 JSON → 分享連結選取一個可轉換的遠端出站,逐項對應參數通常無法保留多個出站的協作方式、路由規則與完整 DNS 策略

轉換 JSON 時,不能只擷取伺服器、連接埠與識別欄位。以 WebSocket 搭配 TLS 為例,至少還要確認傳輸類型、路徑、Host、TLS 開關與 SNI;以 VLESS 搭配 REALITY 為例,還要確認公開金鑰、短識別碼及相關流控參數。少了任何一項,客戶端可能顯示「匯入成功」,但連線仍會失敗。

  1. 先確認輸入結構:分享格式中的 VMess JSON 與核心 outbounds 中的物件,使用的不是同一套欄位。
  2. 再選擇目標:完整設定中有多個遠端出站時,請明確選擇要匯出的項目,不要把直連或封鎖出站當成節點。
  3. 逐項核對:匯入目標客戶端後開啟編輯頁面,確認安全層、傳輸路徑與協定專屬欄位。
  4. 最後驗證:先確認核心能啟動,再測試連線請求;節點可用不代表原設定的分流行為已經還原。

移轉建議:需要保留分流時,優先保留完整設定

若只需要移轉伺服器清單,可以使用分享連結;若要重現原本的 DNS 與路由行為,則應保留完整 JSON,並在目標核心上確認相容性。不要把分享連結當成整套設定的備份。

六、訂閱與格式轉換常見問題

瀏覽器能開啟訂閱,為什麼客戶端顯示零個節點?

先查看回應內容是否真的是連結清單或其 Base64 包裝。瀏覽器可能使用已登入的狀態,而客戶端取得的卻是登入頁面;伺服器也可能依據請求資訊回傳不同內容。檢查訂閱群組中的 URL 是否完整,再確認服務提供者提供的格式是否適用於目標客戶端。

解碼後中文備註變成亂碼,還能繼續匯入嗎?

請先使用 UTF-8 解碼,不要直接把 atob() 的結果當成中文文字。如果只有備註損毀,連線欄位未必有問題,但仍應重新檢查原始內容;若路徑或查詢參數也遭到破壞,請停止匯入,避免帶著錯誤參數進行測試。

完整 JSON 語法正確,為什麼仍無法啟動?

JSON 語法檢查只能確認引號、逗號等結構。接著查看核心記錄中的具體欄位路徑,檢查是否使用目標核心不支援的欄位、是否缺少執行所需設定,以及本機監聽連接埠是否衝突。不要試圖用重複 Base64 編碼來處理啟動錯誤。

把訂閱轉成分享連結後,節點為什麼不再自動更新?

從剪貼簿匯入通常只會建立目前節點的副本,不會保留取得節點的訂閱網址。若需要持續更新,請在「訂閱群組設定」中儲存原訂閱 URL,並從該群組執行更新;手動修改群組中的節點前,也要留意下次更新可能會覆蓋這些修改。

能靠轉換格式讓舊版核心支援新參數嗎?

不行。轉換只能改變表達方式,不會增加核心功能。記下客戶端與核心的實際版本,再確認目標協定、安全層與傳輸方式是否受支援;遇到未知欄位時,優先更新至相容版本,或取得服務端提供的相容設定,不要任意刪除關鍵參數。

實際操作順序可以固定為:確認取得的內容、選擇對應的匯入入口,再核對協定參數與核心記錄。將「取得失敗」、「格式不符」與「連線設定錯誤」分開處理,比不斷更換編碼方式更容易找出問題。