本文重點

訂閱網址負責取得內容,Base64 負責文字編碼,分享連結描述單一節點,原生 JSON 則描述核心的執行設定。本文適合遇到「匯入失敗」、「轉換後少了規則」或「同一份訂閱在不同用戶端結果不同」的使用者:先辨別資料層級,再從正確入口匯入,最後確認轉換是否保留傳輸、TLS、DNS 與路由設定。

一、訂閱網址、編碼與節點設定屬於不同層級

「V2Ray 訂閱」並非嚴格統一的檔案格式。用戶端會先連線至訂閱 URL,再解析伺服器回傳的內容。常見內容是多行分享連結,或將這些連結整段以 Base64 編碼;有些服務也會直接回傳 JSON。網址以 HTTPS 開頭,只能表示取得內容的方式,無法保證內容一定能由特定匯入工具辨識。

項目常見特徵涵蓋內容匯入入口
訂閱 URLHTTPS 網址,可能含存取權杖遠端內容的取得位置訂閱群組設定
Base64 訂閱內容解碼後通常每行是一個連結節點清單,不一定包含本機策略訂閱更新解析器
分享連結vmess:// 或 vless://單一節點及其連線參數從剪貼簿匯入
原生 JSONinbounds、outbounds 等鍵入站、出站,以及可選的 DNS、路由自訂設定入口

JSON 本身只是語法,並不代表特定設定類型。包含 add、id、net 等欄位的 VMess 分享物件,即使通過 JSON 語法檢查,也不能直接當成完整的 Xray 設定執行。反過來說,把完整設定編碼成 Base64,也不會自動變成用戶端支援的節點訂閱。

二、Base64 訂閱:先解碼,再逐行解析

傳統節點訂閱常以換行符號串接多個分享連結,再將整段 UTF-8 文字編碼。用戶端取得內容後,會先還原文字,再逐行辨識協定。VMess 也可能在單一連結內再包一層 Base64,因此「外層訂閱解碼成功」不代表「內層節點欄位有效」。

  1. 取得內容:確認收到的是訂閱資料,而非登入頁面、存取限制說明或伺服器錯誤頁面。
  2. 判斷外層格式:如果內容已以分享連結開頭,先當成純文字處理,不要直接重複解碼。
  3. 解碼:還原外層 Base64 後,確認是否得到每行一個連結的文字。
  4. 解析節點:辨識每行使用的協定,再檢查伺服器位址、連接埠、使用者識別碼與傳輸參數。

標準 Base64 常見字元包括 +、/,結尾可能有 =。有些來源使用 URL 安全變體中的 - 和 _,或省略結尾的填充字元。不同匯入工具的容錯能力不一;不能只因為「沒有等號」就判定訂閱損毀,也不能把整段 Base64 當成 URL 百分比編碼處理。

// 本機 JavaScript 範例:輸入為已取得的多行分享連結文字。
// TextEncoder / TextDecoder 用來保留中文節點名稱。
function encodeSubscription(text) {
  const bytes = new TextEncoder().encode(text);
  let binary = "";
  for (const byte of bytes) {
    binary += String.fromCharCode(byte);
  }
  return btoa(binary);
}

function decodeSubscription(encoded) {
  let normalized = encoded.replace(/\s/g, "")
    .replace(/-/g, "+")
    .replace(/_/g, "/");
  normalized += "=".repeat((4 - normalized.length % 4) % 4);
  const binary = atob(normalized);
  const bytes = Uint8Array.from(binary, char => char.charCodeAt(0));
  return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}

這段程式碼只會轉換文字,不會連線取得訂閱,也不會驗證節點是否可連線。解碼失敗時,先檢查內容是否遭截斷,或是否混入說明文字;即使解碼成功,仍須交由支援相應協定的用戶端解析。瀏覽器直接以中文呼叫 btoa() 可能會發生錯誤,因此範例會先轉換成 UTF-8 位元組。

三、VMess 與 VLESS 分享連結:逐一對應欄位

常見的 vmess:// 分享格式,是在協定前綴後附上一個以 Base64 編碼的 JSON 物件。以下是編碼前的物件,屬於常見的分享慣例,並非完整的核心設定。網域與 UUID 僅用於說明結構,不能直接作為可用節點。

{
  "v": "2",
  "ps": "VMess WS 範例",
  "add": "node.example.org",
  "port": "443",
  "id": "2d1e7e18-49f4-4ab7-8b63-c929d11c5e29",
  "aid": "0",
  "scy": "auto",
  "net": "ws",
  "type": "none",
  "host": "node.example.org",
  "path": "/proxy",
  "tls": "tls",
  "sni": "node.example.org"
}

v 是分享物件的格式標記,不是用戶端版本;ps 是備註;add 和 port 是連線目標;net、host、path 描述傳輸層。此處的 aid 值為零,不能據此推論 VLESS 也有同名參數。不同分享格式可能省略欄位,匯入後請回到節點編輯頁面核對。

VLESS 分享連結通常採用 URI 結構:使用者識別碼位於 @ 前,伺服器與連接埠位於其後,查詢參數用來描述傳輸與安全設定,# 後方則是備註。以下與後文的 JSON 使用相同的範例參數。

vless://[email protected]:443?encryption=none&security=tls&type=ws&host=node.example.org&path=%2Fproxy&sni=node.example.org#Example-WS

結論:依欄位轉換,不要只替換協定名稱

將 vmess:// 改成 vless:// 並不能轉換協定。只有伺服器本身提供相應協定參數,才有依據產生另一種連結;同一節點改用不同格式表示時,也必須保留傳輸、安全層與驗證欄位。

四、原生 JSON:除了節點參數,還包含執行環境

原生 Xray 設定描述整個程序的運作方式。入站決定本機應用程式從何處連入,出站決定要求如何傳送至伺服器,路由與 DNS 則決定分流及解析方式。以下是用來對照欄位的最小設定,採用 VLESS、WebSocket 與 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": "node.example.org",
            "port": 443,
            "users": [
              {
                "id": "2d1e7e18-49f4-4ab7-8b63-c929d11c5e29",
                "encryption": "none"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "tlsSettings": {
          "serverName": "node.example.org"
        },
        "wsSettings": {
          "path": "/proxy",
          "headers": {
            "Host": "node.example.org"
          }
        }
      }
    }
  ]
}
10808
範例本機 SOCKS 入站連接埠
443
範例遠端 TLS 服務連接埠

這兩個連接埠的用途不同。10808 綁定本機迴路位址,只是範例設定,不代表每台裝置的實際值;443 是遠端監聽連接埠,必須與伺服器設定一致。如果本機已有程序監聽相同位址與連接埠,啟動第二份設定可能會失敗。

五、v2rayN 與 v2rayNG:選擇正確的匯入入口

用戶端介面名稱可能隨版本與介面語言而異。以下依常見的簡體中文選單說明;操作前,先確認剪貼簿內容是訂閱 URL、單一節點連結,還是完整 JSON。尤其不要將 HTTPS 訂閱網址當成一般節點連結匯入。

v2rayN:分開匯入訂閱群組與單一節點

  1. 新增訂閱群組

    在主畫面依序選擇「訂閱分組」→「訂閱分組設定」,再於清單中選擇「新增」,填寫備註和訂閱網址後儲存。網址中的查詢參數必須完整保留。

  2. 更新訂閱

    返回「訂閱分組」選單,選擇更新目前或所有訂閱;如果選單提供透過代理或不透過代理的選項,請依目前網路的實際連線狀況選擇,再查看更新記錄。

  3. 匯入單一節點

    複製完整的 vmess:// 或 vless:// 連結,在主視窗選擇「伺服器」→「從剪貼簿匯入批次 URL」,常見快捷鍵為 Ctrl+V。

  4. 確認連線參數

    開啟節點編輯視窗,確認位址、連接埠、UUID、傳輸類型、路徑與 TLS 伺服器名稱。匯入成功只表示解析完成,不代表能連上伺服器。

v2rayNG:訂閱群組與剪貼簿匯入

六、轉換方式:依需要保留的內容選擇

「轉換成功」至少包含三種標準:文字可解碼、用戶端可匯入、連線行為符合預期。即使前兩項都通過,仍可能遺失路由、DNS、指紋或傳輸擴充參數。先確認移轉目標,通常比急著尋找轉換按鈕更能節省排查時間。

透過分享連結移轉節點

建議

使用用戶端提供的分享或複製連結功能匯出,再匯入目標用戶端。完成後逐項確認傳輸與 TLS 參數;本機路由和 DNS 請另外移轉。

適用情境:跨裝置移轉單一節點、整理少量連線

透過訂閱網址維護節點清單

在目標用戶端重新新增訂閱網址,由用戶端解析並更新。將訂閱內容轉成靜態連結清單,只會取得特定時間點的快照,不會保留遠端自動更新機制。

適用情境:節點經常調整、需要持續更新的群組

以原生 JSON 保留策略

在相容的核心之間移轉設定,並逐項檢查檔案引用、連接埠、系統權限與欄位支援狀況。匯入自訂設定後,部分用戶端介面選項不一定會套用至該設定。

適用情境:包含多個出站、自訂 DNS 或複雜路由

移轉後先查看記錄是否有設定解析或監聽錯誤,再選擇一個節點確認實際連線。桌面版也要檢查系統代理或應用程式內代理是否指向正確的入站;Android 則須確認連線服務已啟動,並依系統提示授予 VPN 介面權限。測速有結果與瀏覽器流量確實經過代理,是兩種不同的驗證方式。

七、匯入與轉換常見問題

訂閱網址可以開啟,為什麼更新後沒有任何節點?

先確認回應內容是否為 HTML 頁面、錯誤訊息或用戶端不支援的格式。瀏覽器能連上 URL,不代表回傳內容就是節點清單。確認權杖仍有效後,再查看用戶端更新記錄中的解析錯誤。

Base64 解碼後仍以 vmess 開頭,還要繼續解碼嗎?

外層訂閱已經解開。常見格式中,單行 vmess:// 後方的內容還有一層編碼,但只應解析協定前綴後的內容,不要再次解碼整份多行清單。正常匯入時,這一層會由用戶端處理。

JSON 檢查通過,為什麼核心仍無法啟動?

語法正確不代表欄位有效。先分辨 VMess 分享物件與完整設定,再檢查核心是否支援該協定與欄位;若記錄顯示監聽失敗,請確認本機連接埠是否已被占用,而不是反覆更換訂閱編碼。

轉換成連結後,原本的分流規則為什麼不見了?

單一節點連結通常只包含連線參數。若要恢復分流,請在目標用戶端重新建立路由與 DNS,或採用相容的完整設定移轉方式。不要把缺少本機策略誤認為節點驗證參數遺失。

匯入成功,但出現 TLS 或交握錯誤時該怎麼辦?

開啟節點編輯頁面,依照伺服器資料檢查連接埠、傳輸類型、SNI、WebSocket Host 與路徑,並確認裝置時間正確。不要以關閉憑證驗證取代修正欄位;如果原始連結也無法連線,請繼續檢查伺服器狀態與網路連線。