訂閱 URL 是取得節點的入口,Base64 是文字編碼,分享連結通常描述單一節點,Xray 原生 JSON 則描述核心的執行設定。本文適合遇到「連結能開啟卻匯入失敗」或「JSON 無法新增為訂閱」等問題的使用者,從辨識格式、選擇匯入入口、離線解碼到檢查欄位,說明哪些轉換可以直接完成,哪些需要補齊設定。
一、先分清訂閱網址、回應本文與節點設定
複製到剪貼簿的內容,不一定就是節點。以 https:// 開頭的訂閱網址指向一項資源;用戶端向該網址發出請求後,才會取得實際本文。本文可能是逐行排列的分享連結、這些連結經 Base64 編碼後的內容,也可能是其他格式的設定文件。光看網址副檔名,無法判斷內容格式。
| 內容類型 | 常見形式 | 用途 |
|---|---|---|
| 訂閱 URL | 以 https:// 開頭,可能包含存取權杖 | 用來取得及更新遠端清單,不會直接指出節點使用的協定 |
| Base64 訂閱本文 | 由大量可列印字元組成,結尾可能有 = | 通常包裝多行分享連結,須解碼後才能辨識內容 |
| 單一節點分享連結 | vmess://、vless://、trojan:// 或 ss:// | 描述伺服器、驗證資訊及部分傳輸參數 |
| Xray 原生 JSON | 常見頂層欄位包括 inbounds、outbounds、routing | 定義核心的監聽入口、出站連線及流量處理規則 |
Base64 不提供加密保護。取得本文的人通常能還原節點位址與驗證欄位;訂閱 URL 中的權杖也可能具有相同的存取權限。排解問題時,請勿將完整訂閱網址、QR Code 或節點匯出內容貼到公開討論區。截圖時也要遮住路徑、查詢參數及節點驗證資訊。
二、Base64 訂閱與 VMess 的編碼層次
常見的傳統訂閱方式,是先用換行符號串接多個分享連結,再將整段 UTF-8 文字進行 Base64 編碼。解碼一次後,應會看到一行一個節點。行尾可能使用 LF 或 CRLF;匯入器通常會忽略空白行,但不能假設所有版本都能處理多餘空格或位元組順序標記。
- 外層:整份訂閱本文經 Base64 編碼,解碼後會得到多行 URI。
- 節點層:常見的
vmess://格式,其後半部本身也經過 Base64 編碼,解碼後會得到節點描述 JSON。 - 欄位層:VLESS 等 URI 的備註、路徑及查詢參數可能使用百分比編碼,例如
%20代表空格。
因此,一個 VMess 節點可能需要解碼兩次 Base64,但兩個層次所處理的內容不同。不要看到長字串就反覆解碼,直到「看起來像文字」為止。遇到 vless:// 時,主體通常應以 URI 格式解析,而不是把整段後綴繼續當成 Base64。
常見的 VMess 分享 JSON 使用 v、ps、add、port、id、net、tls 等欄位。其中 v 的常見值 "2" 是此類分享格式的版本識別,不代表用戶端或核心版本,也不能直接交給 Xray 作為原生設定執行。
- 標準 Base64 使用
+和/;URL 安全版本則可能使用-和_。 - 結尾的
=是填充字元,無論是否出現,都不能單獨用來判斷本文有效與否。 - 節點備註若包含中文,必須以 UTF-8 解碼;直接將
atob()的回傳值視為 Unicode 文字,可能會出現亂碼。
三、分享連結能還原哪些欄位
以下使用保留網域名稱及全零 UUID 示範 VLESS URI,只用來說明結構,無法建立實際連線。連接埠 443 是範例遠端連接埠,與用戶端本機監聽連接埠不同。
vless://[email protected]:443?encryption=none&security=tls&type=tcp&sni=node.example.invalid#TLS%20example
| URI 部分 | 設定位置 | 檢查重點 |
|---|---|---|
| 主機與連接埠 | settings.vnext[].address、port | 連接埠須轉換為數值,不要把備註文字一併帶入 |
| 使用者資訊中的 UUID | settings.vnext[].users[].id | 必須與伺服器設定一致 |
encryption=none | users[].encryption | 不代表傳輸層未使用 TLS |
security=tls | streamSettings.security | 須與 TLS、REALITY 等傳輸安全方式區分 |
sni | tlsSettings.serverName | 用於設定 TLS 服務名稱,不應任意替換 |
# 後方的片段 | 用戶端節點備註 | 通常不會影響驗證或網路連線 |
轉換複雜傳輸設定時,至少還要核對 flow、alpn、傳輸路徑、HTTP Host 及相關安全參數。不同分享格式與用戶端版本對參數名稱的定義可能不同。即使位址、連接埠和 UUID 相同,也不代表兩份設定等效。
轉換判斷:匯入後先核對傳輸參數
將原始連結與節點編輯頁逐項比對,先檢查傳輸類型、TLS 服務名稱及 flow,再測試連線;缺少這些欄位時,重新編碼訂閱本文無法修復連線問題。
四、Xray 原生 JSON 不是節點清單
Xray 原生 JSON 描述的是執行環境。inbounds 決定本機接收流量的方式,outbounds 定義連線至遠端的方式,routing 則可將不同請求導向不同出站。以下最小範例對應上一節的 VLESS 節點,並將本機 SOCKS 監聽設定為 127.0.0.1:10808;所有遠端參數仍是無法連線的示範值。
{
"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.invalid",
"port": 443,
"users": [
{
"id": "00000000-0000-0000-0000-000000000000",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"serverName": "node.example.invalid"
}
}
}
]
}
此範例未明確設定 routing 和 dns,僅展示單一入口、單一出站的結構。監聽位址限制為迴圈位址,不會對區域網路開放;udp: true 只代表此 SOCKS 入站允許處理相應請求,並不保證應用程式、遠端或網路路徑都具備可用的 UDP 通道。
轉換範圍:擷取節點與保留執行設定
分享連結轉為原生 JSON
- 解析位址、連接埠、驗證資訊及傳輸參數。
- 補上本機入站與監聽連接埠。
- 依實際需求設定 DNS、記錄檔及路由。
原生 JSON 轉為分享連結
- 選擇可用 URI 表示的代理出站。
- 確認目前的分享格式能否涵蓋所有傳輸欄位。
- 另外備份入站、路由及 DNS 設定。
單一節點 URI 通常無法包含整份執行設定;多個出站、鏈式連線及路由規則也不會自動隨節點一併轉移。
五、v2rayN、v2rayNG 與 v2flyNG 的匯入方式
格式可供解析,與所用核心能否執行該協定,是兩個不同條件。v2rayN 是桌面用戶端,v2rayNG 使用 Xray 核心,v2flyNG 使用 v2fly 核心。匯入前應同時確認用戶端的匯入入口、核心類型及所需的傳輸能力;不要以為某用戶端能儲存的設定,其他用戶端也一定能執行。
訂閱網址:持續管理節點清單
建議方式在 v2rayN 的「訂閱分組」→「訂閱分組設定」中新增網址,再執行「更新全部訂閱(不透過代理)」或相應的透過代理更新操作。選單文字可能因版本略有不同,請以實際介面為準。
適用情況:節點會變動,需要保留日後更新的方式。
分享連結:匯入單一節點
在 v2rayN 中可選擇「伺服器」→「從剪貼簿匯入批次 URL」,常見快捷鍵為 Ctrl+V。v2rayNG 的新增選單提供「從剪貼簿匯入」;v2flyNG 則應使用分享連結匯入功能,並確認核心支援相應協定及傳輸方式。
適用情況:臨時測試、移轉單一節點或逐項核對參數。
原生 JSON:保留完整執行設定
請使用用戶端提供的自訂設定匯入功能,不要填入訂閱網址欄位。v2rayNG 可使用自訂設定匯入功能;v2rayN 則應透過自訂設定伺服器入口處理。v2flyNG 需要與其 v2fly 核心相容的設定,不能直接套用 Xray 專用欄位。
適用情況:需要固定入站、DNS 或複雜路由,且能自行維護設定。
解碼訂閱內容後再手動匯入,通常只會建立節點快照,不會自動保留原訂閱的更新關係。自訂 JSON 也不等同於由介面管理的一般節點:系統代理開關所使用的連接埠,必須與實際入站設定一致。以上例而言只監聽 SOCKS 10808,不能假設另有可用的 HTTP 10809。
六、離線解碼與重新編碼的操作步驟
若只需檢查編碼,可在本機空白頁面的瀏覽器開發人員工具主控台中操作,不必將訂閱資料提交給線上轉換服務。以下僅使用瀏覽器內建 API,不會發出網路請求。先用固定文字測試,確認環境支援 TextEncoder 和 TextDecoder,再於可信任的本機環境處理已取得的本文;不要在不熟悉的網頁主控台貼上真實訂閱資料。
function decodeBase64Text(input) {
const normalized = input.trim()
.replace(/\s+/g, "")
.replace(/-/g, "+")
.replace(/_/g, "/");
if (normalized.length % 4 === 1) {
throw new Error("Base64 長度無效");
}
const padded = normalized
+ "=".repeat((4 - normalized.length % 4) % 4);
const bytes = Uint8Array.from(
atob(padded),
character => character.charCodeAt(0)
);
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}
function encodeBase64Text(text) {
const bytes = new TextEncoder().encode(text);
const parts = [];
for (const byte of bytes) {
parts.push(String.fromCharCode(byte));
}
return btoa(parts.join(""));
}
decodeBase64Text("5rWL6K+V"); // 測試
encodeBase64Text("測試"); // 5rWL6K+V
- 先辨識:若本文已是逐行排列的 URI,就不需要外層解碼;若開頭是 JSON 物件,請先檢查欄位結構。
- 只解碼一層:確認本文是 Base64 後,再呼叫解碼函式,並檢查結果是否為節點列,而非錯誤頁面。
- 保留節點原文:不要對整條 URI 反覆進行百分比解碼,以免改變路徑中保留字元的意義。
- 按行整理:移除純空白行,保留每條分享連結中的所有字元;重新編碼時,以換行符號串接各節點。
- 確認匯入結果:先用單一節點測試,再處理整份清單。只有編碼錯誤時,重新編碼才是相應的修正方式。
上述函式只負責編碼與解碼,不會將 VMess 轉成 VLESS,也不會自動將原生 JSON 轉為訂閱。協定轉換取決於伺服器是否提供相應入口,無法只靠修改字串前綴完成。同樣地,即使將原生 JSON 包裝成 Base64,它仍不是常見的「逐行節點 URI」訂閱。
七、排查匯入失敗及轉換後欄位遺失
訂閱網址可以開啟,為什麼用戶端卻顯示沒有節點?
請檢查實際回應本文,不要只看狀態碼。若內容是登入表單、存取限制說明或 HTML 頁面,應先修復訂閱存取權限。若內容是原生 JSON,請改用自訂設定匯入入口,不要繼續在訂閱欄位中重複新增。
解碼後仍是 vmess://,代表解碼失敗嗎?
這通常表示外層訂閱已正確解碼。先將完整 VMess 連結匯入用戶端。只有需要檢查欄位時,才另外解碼其後的節點描述;取得的分享 JSON 並不是完整的核心設定。
節點已成功匯入,為什麼仍無法連線?
開啟節點編輯頁,核對遠端連接埠、UUID、傳輸類型、TLS 服務名稱及 flow,接著檢查核心記錄檔。匯入成功只表示解析器接受了資料,無法證明遠端可連線、驗證有效,或應用程式已使用本機代理。
轉換後的分流規則和 DNS 怎麼不見了?
單一節點分享連結通常只包含代理出站參數。請回到原始 JSON 備份,分別移轉 routing、dns 及所需的入站設定。不要把這些執行規則塞進節點備註,用戶端不會據此還原完整設定。
透過代理更新訂閱也逾時,需要先換格式嗎?
先確認請求是否確實完成。已有可用節點時,可在 v2rayN 的「訂閱分組」中嘗試相應的透過代理更新操作;若沒有可用連線,應先檢查本機網路及訂閱網址的存取權限。請求逾時發生在解析本文之前,修改 Base64 編碼無法解決問題。
最後分三步確認:是否成功取得訂閱、是否完整解析節點參數,以及流量是否進入預期的出站。變更格式前先備份原始內容;使用自訂 JSON 時,尤其要確認監聽位址與連接埠沒有變動,再檢查應用程式的代理設定。
- 需要自動更新:保留訂閱 URL,並在訂閱分組中管理。
- 只移轉節點:優先使用目標用戶端支援的原始分享連結。
- 需要保留完整行為:移轉並檢查原生設定,逐項確認路由與 DNS,而非只比較節點數量。