訂閱網址是更新入口,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 JSON | URI 使用者資訊、主機、連接埠與查詢參數 |
| 節點識別資訊 | JSON 中的 id | URI 中 @ 前的使用者資訊 |
| 傳輸方式 | 常見欄位 net | 常見查詢參數 type |
| TLS 與服務名稱 | 常見欄位 tls、sni | 常見參數 security、sni |
| 備註 | 常見欄位 ps | # 後的片段,通常經過百分比編碼 |
VLESS 連結通常不是「將整條連結再解碼一次 Base64」。參數也可能包含 flow、fp、pbk、sid,分別與流控、指紋及 REALITY 參數有關。具體名稱與支援範圍取決於客戶端版本,不能只憑協定前綴就認定所有參數都受支援。
- 連接埠:遠端使用
443不代表一定啟用了 TLS,還要一併確認安全層設定。 - 路徑:WebSocket 路徑中的
/可能會寫成%2F;必須依 URI 規則解碼,不能直接刪除百分比符號。 - 網域:伺服器位址、TLS 的 SNI、WebSocket 的 Host 是不同欄位,只有在伺服器要求一致時才填入相同值。
- 換行:逐行排列的節點清單通常每行一條連結;聊天工具插入的硬換行可能會截斷查詢參數。
三、如何解碼 Base64 訂閱?為什麼有時需要分兩層解析
假設回應本文是「多條 VMess 連結組成的文字,再整份進行 Base64 編碼」。第一層解碼後會得到逐行排列的連結;每條 vmess:// 後的載荷仍需另外解碼,才能看到節點欄位。這是兩層包裝疊加的結果,並非所有訂閱都一定要解碼兩次。
- 先檢查原始內容。若逐行文字已經以
vmess://或vless://開頭,就不需要整份解碼。 - 如果看起來是 Base64 文字,再嘗試解碼一次,並確認結果是否為連結清單。
- 如果解碼後出現網頁標籤、登入提示或錯誤訊息,請回到取得內容的步驟處理,並停止格式轉換。
- 若結果是 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 為例,還要確認公開金鑰、短識別碼及相關流控參數。少了任何一項,客戶端可能顯示「匯入成功」,但連線仍會失敗。
- 先確認輸入結構:分享格式中的 VMess JSON 與核心
outbounds中的物件,使用的不是同一套欄位。 - 再選擇目標:完整設定中有多個遠端出站時,請明確選擇要匯出的項目,不要把直連或封鎖出站當成節點。
- 逐項核對:匯入目標客戶端後開啟編輯頁面,確認安全層、傳輸路徑與協定專屬欄位。
- 最後驗證:先確認核心能啟動,再測試連線請求;節點可用不代表原設定的分流行為已經還原。
移轉建議:需要保留分流時,優先保留完整設定
若只需要移轉伺服器清單,可以使用分享連結;若要重現原本的 DNS 與路由行為,則應保留完整 JSON,並在目標核心上確認相容性。不要把分享連結當成整套設定的備份。
六、訂閱與格式轉換常見問題
瀏覽器能開啟訂閱,為什麼客戶端顯示零個節點?
先查看回應內容是否真的是連結清單或其 Base64 包裝。瀏覽器可能使用已登入的狀態,而客戶端取得的卻是登入頁面;伺服器也可能依據請求資訊回傳不同內容。檢查訂閱群組中的 URL 是否完整,再確認服務提供者提供的格式是否適用於目標客戶端。
解碼後中文備註變成亂碼,還能繼續匯入嗎?
請先使用 UTF-8 解碼,不要直接把 atob() 的結果當成中文文字。如果只有備註損毀,連線欄位未必有問題,但仍應重新檢查原始內容;若路徑或查詢參數也遭到破壞,請停止匯入,避免帶著錯誤參數進行測試。
完整 JSON 語法正確,為什麼仍無法啟動?
JSON 語法檢查只能確認引號、逗號等結構。接著查看核心記錄中的具體欄位路徑,檢查是否使用目標核心不支援的欄位、是否缺少執行所需設定,以及本機監聽連接埠是否衝突。不要試圖用重複 Base64 編碼來處理啟動錯誤。
把訂閱轉成分享連結後,節點為什麼不再自動更新?
從剪貼簿匯入通常只會建立目前節點的副本,不會保留取得節點的訂閱網址。若需要持續更新,請在「訂閱群組設定」中儲存原訂閱 URL,並從該群組執行更新;手動修改群組中的節點前,也要留意下次更新可能會覆蓋這些修改。
能靠轉換格式讓舊版核心支援新參數嗎?
不行。轉換只能改變表達方式,不會增加核心功能。記下客戶端與核心的實際版本,再確認目標協定、安全層與傳輸方式是否受支援;遇到未知欄位時,優先更新至相容版本,或取得服務端提供的相容設定,不要任意刪除關鍵參數。
實際操作順序可以固定為:確認取得的內容、選擇對應的匯入入口,再核對協定參數與核心記錄。將「取得失敗」、「格式不符」與「連線設定錯誤」分開處理,比不斷更換編碼方式更容易找出問題。