先分清訂閱網址、訂閱回應內容與節點分享連結,再用一組 VLESS + WebSocket + TLS 範例對照 URI 與 Xray JSON 欄位。本文適合遇到「訂閱網址能開啟卻無法匯入」、「Base64 解碼後仍不是設定檔」或需要遷移節點的使用者。讀完即可判斷該使用哪種匯入方式,並了解轉換時可能遺失的路由、DNS 與本機監聽設定。
訂閱網址、Base64 與 JSON 的層級差異
訂閱網址通常是 HTTPS URL,必須由用戶端連線存取後才會取得節點資料。URL 本身不是 Base64,也不是節點設定;真正需要辨識的是伺服器回傳的回應本文。同一個訂閱網址可能依請求參數或用戶端識別資訊回傳不同內容,因此不能只看網址結尾判斷格式。
| 內容形式 | 辨識線索 | 適用匯入方式與限制 |
|---|---|---|
| 訂閱網址 | 以 https:// 開頭,可能包含存取權杖 | 新增至訂閱設定,以保留後續更新功能 |
| Base64 訂閱本文 | 解碼後通常是以換行排列的分享連結 | 通常由用戶端的訂閱更新功能解析;不是完整的執行設定 |
| 單一節點分享連結 | 以 vless:// 或常見的 vmess:// 開頭 | 適合從剪貼簿匯入節點;通常不包含本機路由設定 |
| 核心原生 JSON | 包含 inbounds、outbounds 等欄位 | 使用與核心相符的自訂設定匯入方式,並受核心支援範圍限制 |
Base64 只是位元組編碼,並非加密。取得訂閱本文的人通常可以還原伺服器位址與身分資訊。JSON 也只是資料語法:以大括號開頭的文字,可能是節點描述、API 錯誤訊息,或完整的核心設定。必須檢查內部欄位,不能把「合法 JSON」直接當成「可執行設定」。
Base64 訂閱解碼與重新編碼
常見的 Base64 訂閱會先以換行符號串接多條分享連結,再將整段 UTF-8 文字編碼。解碼後若看到多行 vless:// 或 vmess://,表示外層訂閱已還原;不必再對每條 VLESS 連結解碼。有些服務會直接回傳明文連結清單,遇到這種情況就略過外層解碼。
- 先確認取得的是回應本文,而不是瀏覽器登入頁面、存取限制提示或附有狀態碼的錯誤訊息。
- 對疑似 Base64 的本文移除空格與換行,支援 URL 安全變體中的
-、_,再補上結尾填充字元。 - 將解碼後的位元組以 UTF-8 讀取,逐行檢查通訊協定前綴,並保留每條連結中的參數。
- 重新編碼前,先確認用戶端確實需要 Base64 清單;本機編碼產生的只是靜態文字,不會建立可自動更新的 HTTPS 訂閱服務。
以下是可在本機瀏覽器開發者工具中使用的原生 JavaScript 函式。函式透過位元組陣列處理中文備註,避免直接用 btoa 編碼中文時出錯。它只會轉換傳入的文字,不會發出網路請求;請使用可信任的內容作為輸入。
function decodeSubscription(source) {
const compact = source.trim().replace(/\s+/g, "")
.replace(/-/g, "+").replace(/_/g, "/");
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(compact)) {
throw new Error("輸入不是有效的 Base64 字元序列");
}
const padded = compact + "=".repeat((4 - compact.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);
}
const sampleText = "範例節點";
console.log(decodeSubscription(encodeSubscription(sampleText)));
解碼函式發生錯誤時,不要反覆套用多層轉換。先檢查本文是否遭到截斷、是否包含引號或網頁標籤,再確認內容是不是明文清單。即使解碼成功,仍須由用戶端驗證每條連結的通訊協定、必要欄位與傳輸設定。
vless:// 與 vmess:// 的欄位結構
VLESS 分享連結通常採用 URI 格式:使用者資訊欄位放 UUID,主機與連接埠描述伺服器,查詢參數描述傳輸方式與安全層,井字號後則是節點備註。以下範例使用文件專用網域與示範 UUID,只供欄位對照,不代表可連線的服務。
vless://[email protected]:443?encryption=none&security=tls&type=ws&host=example.net&path=%2Fws&sni=example.net#WS-TLS-demo
path=%2Fws 解碼後為 /ws。查詢參數中的路徑、備註與特殊字元應使用百分比編碼;不要將整條 URI 一次編碼,也不要先解碼完整 URI 再手動拆分,否則路徑中的 & 等字元可能被誤認為參數分隔符。IPv6 位址放在主機欄位時,也必須加上方括號。
VLESS 分享連結
- 身分
- UUID 位於 @ 之前
- 傳輸方式
- type=ws
- 安全層
- security=tls
- 路徑
- path=%2Fws
本範例使用 WebSocket 與 TLS,不應額外加入 Vision flow。
常見的 VMess 分享格式
- 外層格式
- vmess:// 後方接 Base64
- 伺服器
- JSON 中的 add、port
- 身分
- JSON 中的 id
- 傳輸方式
- JSON 中的 net、path
這是常見的用戶端分享格式慣例,不是可直接交由核心執行的 JSON。
常見 VMess 分享 JSON 中的 v 代表分享格式版本,不是 VMess 通訊協定版本;ps 通常代表備註。其結構與核心出站設定中的 settings.vnext 不同。VMess 分享格式也有不同變體;遷移時建議優先使用來源與目標用戶端的匯入、匯出功能,不要假設所有 vmess:// 內容的內部結構都完全相同。
將 VLESS 連結轉換為 Xray 原生 JSON
要將分享連結轉換成完整 JSON,必須補上連結中沒有的本機入站與出口標籤。以下設定對應前面的 VLESS 範例,採用 Xray 設定格式;本機僅監聽 127.0.0.1:10808。實際使用前,請替換成已獲授權的真實伺服器參數;範例網域本身無法提供代理服務。
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"tag": "socks-in",
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": true
}
}
],
"outbounds": [
{
"tag": "proxy",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "example.net",
"port": 443,
"users": [
{
"id": "9f2a54d1-8bc6-4d71-a903-0be458e623fd",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "ws",
"security": "tls",
"tlsSettings": {
"serverName": "example.net"
},
"wsSettings": {
"path": "/ws",
"headers": {
"Host": "example.net"
}
}
}
}
]
}
example.net:443對應出站設定中的address與port;UUID 對應users[0].id。type=ws對應streamSettings.network,security=tls則對應傳輸安全層。sni對應tlsSettings.serverName,host對應 WebSocket 的 Host 請求標頭,兩者用途不同。encryption=none是 VLESS 使用者欄位,不代表已關閉 TLS;是否啟用 TLS,須查看streamSettings.security。- 本範例沒有額外的分流規則,流量會使用第一個出站;也不會替你啟用作業系統或應用程式的代理設定。
在 v2rayN 與 v2rayNG 選擇匯入方式
先分清楚「保留訂閱關係」與「匯入單一節點」。解碼訂閱後逐條匯入雖然能建立節點,但通常會失去訂閱來源與自動更新關係。若要持續更新伺服器清單,應保留原始訂閱 URL,而不只是目前匯出的分享連結。
v2rayN:分別處理訂閱、剪貼簿與自訂設定
- 訂閱 URL:開啟「訂閱分組」→「訂閱分組設定」,新增分組並填入備註與 URL,儲存後使用「訂閱分組」中的更新訂閱功能。更新完成後,請檢查新增的節點;不要將 URL 當成單一節點網址填入。
- 分享連結:複製完整的
vless://或vmess://文字,再選擇「伺服器」→「從剪貼簿匯入批次 URL」。匯入後編輯節點,確認位址、連接埠、TLS、SNI 與傳輸路徑。 - 完整 JSON:使用「伺服器」→「新增自訂設定伺服器」等自訂設定匯入方式,選擇與檔案相符的核心,再依介面指示選取設定檔。請勿將整份 JSON 貼到訂閱 URL 欄位。
v2rayNG:先建立訂閱群組,再更新訂閱
- 在主畫面選單中開啟「訂閱群組設定」,按新增按鈕填入訂閱名稱與網址,儲存後返回主畫面並執行「更新訂閱」。
- 若要匯入單一分享連結,請複製完整文字,再點選主畫面的「+」→「從剪貼簿匯入」。確認產生的設定類型與來源相符後再連線。
- 匯入 Xray 原生 JSON 時,請使用「+」選單中的自訂設定匯入功能,並依使用的版本選擇檔案或剪貼簿方式。不要把常見的 VMess 分享 JSON 當成完整自訂設定匯入。
不同發行版本的選單文字可能略有差異,請依「訂閱群組」、「剪貼簿連結」、「自訂設定」這三種功能尋找。使用 v2flyNG 時,也要另外確認訂閱中的通訊協定與傳輸方式是否相容;v2rayNG 能辨識某個 Xray 節點,不代表另一個核心的用戶端也能執行相同設定。
JSON 反向匯出與轉換時的資訊損失
「互相轉換」不代表三種格式一定能完整往返。單一節點連結主要描述遠端連線,而完整 JSON 可能包含多個入站、出站、DNS、路由、策略與記錄設定。將 JSON 匯出為一條 VLESS 連結,本質上是選擇其中一個出站並擷取連線參數;其他本機行為通常無法寫入連結。
| 轉換方向 | 通常可保留 | 需要另外處理 |
|---|---|---|
| 連結清單與 Base64 互轉 | 原始連結文字與排列順序 | 字元編碼、換行與 URL 安全變體 |
| VLESS 連結轉 JSON | 位址、身分、常見傳輸與安全參數 | 補上入站、出口標籤與本機路由 |
| JSON 出站轉分享連結 | 目標用戶端支援的單一節點欄位 | 選擇出站、處理擴充欄位,並另存 DNS 與分流規則 |
| VMess 轉 VLESS | 僅能參考共通的位址與傳輸資訊 | 伺服器必須實際提供 VLESS,不能只改前綴切換通訊協定 |
遷移時,建議先在來源用戶端選取節點並使用匯出分享連結功能,再到目標用戶端檢查欄位。若手邊只有包含多個出站的 JSON,先依據 outbounds 中的 tag 與 protocol 確認目標,避免把直連或阻斷出站誤認為伺服器。涉及擴充參數時,請保留原始 JSON 備份,並在目標端檢查實際產生的設定。
- 只遷移單一節點:使用用戶端匯出的分享連結,接著核對傳輸與安全參數。
- 遷移整個訂閱:保留原訂閱 URL,並在目標用戶端重新建立訂閱群組。
- 遷移完整行為:另外備份路由、DNS 與自訂設定,同時排查本機連接埠衝突。
訂閱解碼與匯入常見問題
訂閱網址在瀏覽器中能開啟,為什麼用戶端更新失敗?
先確認回傳內容確實是節點清單,而不是登入頁面或 API 錯誤 JSON。接著檢查完整 URL 是否包含權杖與查詢參數。若目前網路無法直接連線至該網址,且已有可用節點,可選擇透過代理更新;不要把尚未匯入的節點當成更新所需的唯一網路出口。
Base64 解碼成功,卻顯示沒有可匯入的伺服器?
檢查解碼結果中每一行的通訊協定前綴。外層 Base64 解碼成功,只代表內容可以還原,不代表用戶端支援其中格式。若結果是 JSON,請進一步判斷它是分享欄位物件還是完整設定;若是 HTML,應回頭檢查訂閱請求,不要繼續編碼。
分享連結能匯入,但連線仍逾時,該怎麼辦?
開啟節點編輯畫面,對照來源檢查連接埠、傳輸路徑、TLS 與 SNI。本文範例的遠端連接埠是 443,本機 10808 僅為 SOCKS 監聽連接埠,兩者不能互換。接著查看核心記錄,判斷是網域解析、連線逾時還是 TLS 交握錯誤;「匯入成功」只表示解析器接受了這些欄位。
為什麼轉換後中國大陸直連規則消失了?
節點分享連結通常不包含完整的本機路由設定。請在目標用戶端另外還原路由;若使用自訂 JSON,請確認 routing.rules 與出口標籤相符。需要設定 domainStrategy 時,應放在 routing 層級,而不是塞進單一規則。
最後驗證時,每次只調整一個層級:先確認內容格式正確,再檢查欄位是否完整,最後才確認網路與核心是否正常運作。這樣能分別處理「訂閱取得失敗」、「連結解析失敗」與「節點連線失敗」,避免在編碼工具與代理設定之間反覆嘗試。