官方手冊 · Config 參考
Shadowrocket 設定指南 規則與比對順序
本頁是依主題編排的完整手冊,說明設定檔的組織方式、請求如何比對規則,以及策略與 DNS 如何影響結果。首次匯入與建立連線,請先閱讀使用說明;完成快速入門後,再回到本頁逐項檢查設定。
- General / Rule
- Host / URL Rewrite
- PROXY / DIRECT / REJECT
設定檔結構:先區分資料與規則
Shadowrocket 中的伺服器資訊與設定檔各有不同用途。伺服器資訊說明要連到哪裡、使用哪種協定,以及如何驗證身分;設定檔則描述如何處理請求、哪些目標直接連線,以及哪些目標交由代理策略處理。匯入訂閱後看得到伺服器,不代表已選取預期的規則檔。反過來說,儲存了一份規則完整的檔案,也不代表其中引用的代理出口已具備可用參數。排查問題時,應分別確認這兩部分。
Config 中的檔案與實際生效檔案
進入 Config 後,先確認目前使用的檔案,再檢查準備編輯的檔案。清單中有多份設定時,檔名只能用來辨識,無法證明內容相同。修改前先保留副本,並記下目前的 Global Routing 模式與所選伺服器;如此一來,即使修改後無法正常連線,也能切回原檔比對。遠端設定檔還要確認更新方式,以免本機編輯內容隨後被來源檔覆蓋。
設定檔通常採用分節結構,以方括號括住節名,並在各節逐行填入設定或規則。General 集中放置一般選項,Rule 用來設定請求分流,Host 用來設定靜態主機對應,URL Rewrite 則處理符合條件的 URL。各節用途不同,不能因為都寫在同一個檔案中,就把它們視為一張從頭執行到尾的規則清單。尤其不要將 Host 行直接貼到 Rule 節。
[General]
bypass-system = true
dns-server = system
[Rule]
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
FINAL,PROXY
閱讀片段時保留上下文
上方是用於參考的最小範例:General 中兩行以等號指定值,Rule 中各欄位以英文逗號分隔。此範例僅展示一般選項、網域規則、私有位址規則與兜底規則之間的關係,不能取代你的伺服器資訊。PROXY 表示交由代理策略處理,最終出口仍取決於目前的設定與所選伺服器。範例中的 example.com 是保留用的示例網域;替換時應填入實際要處理的目標,而非服務商的伺服器位址。
閱讀單行規則時,先看第一個欄位的規則類型,再看比對對象,最後確認策略與選用參數。例如 IP-CIDR 行比 DOMAIN-SUFFIX 行多了 no-resolve,表示與觸發網域解析有關,不是策略名稱。FINAL 的結構則不同,不包含比對對象欄位。複製時應保留英文標點與欄位順序,避免輸入法將逗號轉成中文逗號,或在節名中加入多餘字元。
註解應獨立成行,說明為何需要某個例外,而非只是重述規則內容。對於從其他地方取得的片段,先判斷它屬於哪個節、需要哪些前置條件,再決定插入位置。不要假設所有節名相似的設定檔都能直接共用;設定項目、選用參數與功能支援情況,請以 Shadowrocket 目前 App 內的說明為準。若有無法辨識的項目,先針對單行進行測試。
本機維護與訂閱更新的界線
Subscribe 主要用於更新伺服器項目;Config 檔案更新則可能變更規則、DNS 或其他一般行為。即使兩者來自同一家服務商,更新範圍也不一定相同。維護前先確認正在更新哪一類內容,再觀察更新後所選伺服器與規則檔是否有變化。若一概把連線異常歸因於訂閱失效,容易忽略實際原因可能是切換了檔案,或本機例外規則遭到取代。
儲存設定後,應回到使用介面確認生效狀態,而不只是確認編輯器已關閉。有些選項只影響新連線,既有連線仍可能沿用先前建立的通道。進行比對測試時,應先關閉舊請求,再重新發出;若需要重新建立連線,請先儲存進行中的工作。完整操作順序請參閱使用說明;本頁後續章節著重說明各項設定的判斷依據。
General 與 DNS:解析不等於出口策略
General 中的設定會影響請求進入規則判斷前後的基本行為,因此修改影響範圍通常大於單一網域規則。DNS 負責將網域轉換為位址,Rule 決定如何處理請求,伺服器參數則負責建立代理連線;這三層彼此相關,但不能互相取代。網域能解析,不代表目標服務就能連線;代理伺服器能連線,也不代表所有網域都能取得適當的解析結果。
先建立可供判斷的基準
[General]
bypass-system = true
dns-server = system
此處的 dns-server = system 表示以系統 DNS 作為基準。這有助於先觀察目前網路的基本解析行為,但不保證適用於所有網路。bypass-system 是一般系統流量繞過設定,不應視為「所有私有位址直連」的替代寫法。是否需要新增特定位址規則,應依目標位址、目前網路與請求記錄判斷,不能只憑設定名稱推測涵蓋範圍。
初次排查時,先減少 General 選項,讓每次變更都有明確依據。若同時更換 DNS、新增規則並切換伺服器,之後即使頁面恢復正常,也無法確認是哪項變更生效。較穩妥的做法是固定伺服器與 Global Routing,只變更一個變數,以相同目標重新發出請求,再記錄結果。恢復正常後,再決定是否保留該項變更。
網域規則與位址規則所需資訊不同
DOMAIN、DOMAIN-SUFFIX 與 DOMAIN-KEYWORD 依賴請求中可辨識的網域;IP-CIDR 與 GEOIP 則依賴位址資訊。若前面的網域規則已能決定請求策略,就沒有必要為了後面的位址規則額外進行比對。若請求進入位址類規則,客戶端可能需要取得可用的目標位址。這裡的解析流程不應直接等同於最終連線使用的解析路徑,尤其代理協定與遠端處理方式不同時更是如此。
有些請求以位址發出,或客戶端未取得足夠的網域資訊,因此網域規則沒有可供比對的對象。即使瀏覽器網址列顯示網站名稱,也不能據此認定每個底層請求都帶有相同網域。請查看個別連線記錄,分別確認網域、目標位址、命中類型與使用的策略。一個頁面包含多個網域時,也應逐一檢查失敗請求,而不是只測試首頁的主要網域。
DNS 設定變更後的驗證範圍
切換網路後發生異常,先比較同一網域在目前網路下能否解析,再確認新請求是否實際套用預期策略。既有快取會影響測試結果,既有連線則可能完全不會重新解析。可以關閉相關頁面後重新開啟,必要時依 App 提供的操作重新建立連線,再查看新記錄。不要把一次重新整理成功當成長期結論,也不要只因某個位址改變就判定解析有誤。
對本機網路資源而言,系統 DNS 有時負責解析內部名稱;任意更換 DNS 來源可能讓這些名稱失去解析途徑。對公用網域來說,不同網路可能回傳不同服務位址,這種差異本身不代表故障。應先確認回傳位址是否可連線、請求是否使用正確協定,以及伺服器憑證是否與網域相符,再考慮調整 DNS。直接輸入位址瀏覽 HTTPS 網站,通常無法完整模擬正常的網域請求。
不要長期依賴 Host 對應來掩蓋動態網域的解析問題。對應會固定位址,服務日後遷移時可能仍指向舊位址,也會讓 DNS 調整看起來沒有作用。若同一網域同時有 Host 項目與網域規則,應分別記錄這兩種設定:前者變更位址來源,後者決定策略。刪除對應前也要確認是否仍有本機服務依賴它,避免排查問題反而造成新的連線異常。
涉及隱私與診斷時,只保留必要的目標資訊。DNS 記錄可能揭露正在瀏覽的網域,分享截圖或文字前,應移除個人服務名稱、帳號識別資訊與訂閱網址。若要進一步排查連線失敗,可依照使用說明中的疑難排解步驟檢查授權、伺服器與網路狀態;DNS 應視為明確的一個層面來檢查,而非所有故障的統一解釋。
網域規則:精確比對、後綴與關鍵字
網域規則適合表達「這項服務應使用哪種策略」,通常也比追蹤不斷變動的服務位址更直觀。選擇類型時,先確認要涵蓋單一完整主機名稱、一個網域及其子網域,還是任何包含特定字串的網域。這三種規則的涵蓋範圍依序擴大,不要只因為寫法較短就選擇範圍最大的類型。範圍越廣,越需要確認是否會比對到原本無關的請求。
DOMAIN:完整網域精確比對
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN,static.example.com,DIRECT
FINAL,PROXY
DOMAIN 用於比對完整網域。第一行只指定 api.example.com 的處理方式,不會自動涵蓋 example.com,也不會自動涵蓋更深層的子網域。適合用於單一介面,或作為大範圍規則前的特定例外。填寫時只輸入主機名稱,不要加上 https://、連接埠、路徑或查詢參數;這些 URL 組成部分不是 DOMAIN 的比對欄位,混在一起會改變原本要指定的對象。
精確規則便於檢查,因為每一項都能對應到一個特定服務。缺點是頁面若另外請求其他網域,就需要再確認它們的策略。不要因為主要網域已命中,就認定登入、圖片、驗證與介面請求也會使用相同出口。排查時應從失敗的請求記錄取得實際主機名稱,再決定是否補上規則;只從網址外觀推測依賴網域,容易漏掉真正失敗的位置。
DOMAIN-SUFFIX:涵蓋網域後綴
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
FINAL,PROXY
DOMAIN-SUFFIX,example.com,DIRECT 用於涵蓋 example.com 及其子網域。它依據網域後綴關係判斷,不代表任意包含該字串的網域都會命中;名稱中帶有 example.com 字樣的其他網域,不一定屬於同一範圍。上例先將 api.example.com 指定為 PROXY,再讓該網域下的其他請求使用 DIRECT。先列出精確例外,再列概括規則,便於理解例外與預設行為。
設定後綴時,通常只填 example.com,不要原樣貼上瀏覽器中的完整 URL,也不要將網頁路徑當成網域的一部分。不要因其他語法使用萬用字元,就直接套用 *.example.com。若只需要涵蓋單一主機名稱,優先使用 DOMAIN;確實需要涵蓋整組子網域時,再使用 DOMAIN-SUFFIX。涵蓋範圍應由實際需求決定,而非規則數量。
DOMAIN-KEYWORD:涵蓋範圍較廣的字串比對
[Rule]
DOMAIN-KEYWORD,example,PROXY
FINAL,DIRECT
DOMAIN-KEYWORD 會檢查網域是否包含指定字串。它不會判斷某段文字是品牌、組織名稱或網域邊界,因此 example 可能出現在多個互不相關的網域中。關鍵字規則適合已清楚掌握涵蓋範圍的情境,也可用於暫時診斷,但不能取代目標網域盤點。短字串、常見詞或業務涵義廣泛的詞彙,尤其容易造成意外命中。
若把關鍵字規則放在精確規則之前,後面的精確規則便沒有機會處理這些請求。即使精確規則「看起來更具體」,也不會因此自動取得較高優先順序。測試時應挑選三類目標:確實要涵蓋的網域、不應涵蓋但含有相同字串的網域,以及完全無關的網域。只有涵蓋與排除都符合預期,才能確認這條規則的範圍適合目前設定。
規則比對對象不是伺服器名稱
網域規則的比對對象是請求目標,不是 Home 中顯示的伺服器備註。修改伺服器名稱不會改變 DOMAIN-SUFFIX 的比對對象;反過來,修改目標網域規則也不會修正伺服器驗證參數。若同一目標在 Proxy 模式下可連線,在 Config 模式下卻失敗,應先比較命中策略與出口,而不是立刻重新填寫 Add Server。兩個層面的變更應分開驗證。
檢查現有網域規則時,可依「精確例外、明確後綴、必要關鍵字」的順序整理,並為每組記錄用途。刪除重複項目前,先比較策略:相同網域搭配不同策略,並不能任意合併。若要封鎖目標,可將策略改為 REJECT,但比對範圍的判斷方式不變;詳細說明請參閱REJECT 規則與封鎖原理。
位址與請求特徵:IP-CIDR、GEOIP、USER-AGENT
位址類規則不依賴服務網域是否穩定,而是依目標位址或位址所屬地區進行判斷。適用於私有網路、已知位址範圍,或作為較概括的後續分類,但無法精確描述某個網站的完整服務範圍。同一服務可能使用多個位址範圍,不同服務也可能共用基礎設施。若把觀察到的某個位址視為網站的永久識別標記,規則就會逐漸偏離實際情況。
IP-CIDR 與前綴長度
[Rule]
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
IP-CIDR6,fc00::/7,DIRECT,no-resolve
FINAL,PROXY
CIDR 寫法由網路位址與前綴長度組成。IPv4 的 /32 表示單一位址,較短的前綴則涵蓋更大的位址範圍;192.168.0.0/16 並不是「只比對最後兩段為零的位址」,而是描述整個前綴範圍。上例展示常見的私有 IPv4 位址範圍與 IPv6 唯一本機位址範圍。這些僅為語法範例,是否需要全部加入,應依實際存取目標與目前網路決定。
私有位址直連只會決定策略,不會建立原本不存在的本機路由,也不會讓不同網路中的同名私有位址自動互通。若目標位於另一個網路中,仍需要具備正確的網路連線條件。多個網路使用相同私有位址時,也可能發生位址含義衝突。因此,即使看到 DIRECT 命中卻仍無法連線,應繼續確認目前連線的網路、目標裝置是否在線,以及連接埠是否開放,而不是一再擴大 CIDR 範圍。
no-resolve 的適用界線
no-resolve 用來避免僅為比對該位址規則而觸發網域解析。它不代表整個請求都禁止使用 DNS,也不是強制將特定目標改成直連。若請求原本就帶有可用的目標位址,位址規則仍可能命中;若目前只有網域而缺少可用位址資訊,就不應期待這條規則會主動解析後再完成判斷。疑難排解時,必須先釐清請求當下具備哪些資訊。
是否加入 no-resolve,取決於這條規則要負責什麼。對於明確的私有位址存取,避免為每個公用網域額外嘗試位址比對,通常比較容易理解;若確實需要依解析後的位址分類請求,就應了解省略此參數可能產生的解析依賴。不要機械式地在每條規則末尾加上它;DOMAIN 或 FINAL 也不能照搬位址規則的欄位結構。
GEOIP 是位址分類,不是網站歸屬判斷
[Rule]
DOMAIN,api.example.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY
GEOIP,CN,DIRECT 會依可用的目標位址及地理歸屬資料庫進行判斷,而不是依網頁文字、網域後綴或使用者所在地判斷。中文頁面的位址不一定歸類為 CN,其他語言頁面的位址也可能歸類為 CN。CDN、位址遷移與資料庫差異都可能影響結果,因此 GEOIP 較適合作為概括規則,並應放在需要明確處理的網域例外之後,而不是用來證明網站屬於哪個組織。
| 類型 | 判斷依據 | 主要限制 |
|---|---|---|
IP-CIDR | IPv4 位址前綴 | 位址範圍不等於網站完整涵蓋範圍 |
IP-CIDR6 | IPv6 位址前綴 | IPv4 規則不會自動涵蓋 IPv6 |
GEOIP | 位址的地理歸屬 | 受目標位址與資料庫資訊影響 |
USER-AGENT | 可辨識的 User-Agent | 受請求可見性及實際欄位影響 |
USER-AGENT 不是通用的 App 選擇器
[Rule]
USER-AGENT,ExampleClient*,DIRECT
FINAL,PROXY
USER-AGENT 依據可辨識請求中的 User-Agent 欄位進行比對;上例的 ExampleClient 只是示例文字,不代表任何實際 App。它不能等同於依 App 程序分流:多個請求可能使用相同欄位,同一個 App 也可能產生不同欄位,有些流量則完全沒有可供規則讀取的內容。尤其對加密請求,不能假設客戶端自然看得到其中的請求標頭。
若 USER-AGENT 規則沒有命中,應先確認欄位是否可見、實際內容是否符合模式,再檢查規則位置。不要只為了讓一條規則生效,就擴大不必要的流量檢查範圍。若要處理加密內容,應另外評估授權、憑證信任與隱私界線;本頁的位址與策略範例不需要啟用額外的加密內容處理。若需求可以用清楚的網域表達,通常適合先從網域規則開始驗證。
連線策略與 Global Routing 三種模式
規則告訴客戶端「哪些請求屬於這一類」,策略則告訴客戶端「這類請求要如何處理」。PROXY、DIRECT、REJECT 是規則中的策略關鍵字;Global Routing 下的 Config、Proxy、Direct 則是整體運作模式。兩組名稱彼此相關,但屬於不同層級。排查前必須同時記錄目前模式與命中策略,否則容易把模式變更造成的結果,誤認為某條規則已修復問題。
PROXY、DIRECT 與 REJECT
PROXY 表示將符合條件的請求交由代理策略處理,最終能否建立連線,仍取決於出口選擇、協定參數、驗證資訊與目前網路。它不保證所有目標都能存取,也不會自動建立伺服器。DIRECT 表示直接連線至目標,連線仍會經過裝置目前使用的網路。REJECT 表示拒絕符合條件的請求,客戶端可能以相應的失敗結果結束連線;它不會把請求改送到其他伺服器。
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN,local.example.com,DIRECT
DOMAIN,blocked.example.com,REJECT
FINAL,PROXY
三條範例分別表示代理、直接連線與拒絕處理,網域僅作為教學對象。若 api.example.com 命中 PROXY 後失敗,下一步應檢查出口,而不是假設客戶端會退回 DIRECT。若 blocked.example.com 命中 REJECT,連線失敗正是策略結果,不應再把它當成伺服器失效的證據。測試前先明確定義成功標準:允許存取、透過指定出口連線,或依預期拒絕。
比較 Config、Proxy、Direct 的用途
| 模式 | 主要用途 | 排查時的觀察重點 |
|---|---|---|
| 設定 / Config | 依所選設定檔執行規則分流 | 檔案、順序、命中規則與策略 |
| 代理 / Proxy | 用來比對代理連線路徑 | 所選出口與伺服器連線能力 |
| 直連 / Direct | 用來比對目前網路路徑 | 本機網路與目標的直接連線能力 |
此處的三種模式是用來建立排查思路,並不代表系統中的每一類流量一定都以相同方式處理。系統流量、設定中的繞過項目與個別功能仍可能形成界線。比對測試應使用同一個目標與新建立的請求,維持網路環境一致,並查看實際記錄。只憑狀態列圖示或某個頁面能開啟,無法確認所有請求使用了哪種路徑。
若 Proxy 可用但 Config 不可用,應優先確認目標是否被 DIRECT、REJECT 或其他較前面的規則處理,再檢查目前的 Config 檔案是否正確。若 Config 與 Proxy 都失敗,可接著確認伺服器位址、連接埠、協定與驗證資訊,並以其他已知可用的目標區分出口整體異常或單一目標異常。Direct 可用只代表目前網路有一條可行路徑,無法證明代理參數一定正確。
所選伺服器與規則策略的關係
Home 中所選的伺服器、設定中存在的策略群組,以及規則引用的策略名稱,必須放在同一個脈絡下理解。簡單設定可以使用 PROXY,交由目前的代理策略處理;較複雜的設定若引用自訂策略名稱,就必須確認該名稱確實存在且指向有效成員。不要把他人檔案中的自訂名稱當成通用關鍵字直接複製,也不要以為修改伺服器備註後,所有引用都會自動維持有效。
協定參數決定代理連線本身的建立方式,與規則策略彼此相關但各自獨立。以 Trojan 為例,位址、連接埠、密碼與 TLS 相關參數應依據既有伺服器資訊填寫;將規則從 DIRECT 改成 PROXY,無法修正錯誤的驗證參數。欄位填寫範圍請參閱Trojan 參數說明;排查時仍應分開檢查規則與伺服器。
REJECT 也無法滿足所有內容過濾需求。同一個網域可能同時承載必要功能與希望拒絕的請求,拒絕整個網域可能影響登入、載入或同步。對加密流量而言,網域層級規則通常無法據此區分同一主機下的不同網頁路徑。若需要更細緻的控制,應先確認目標資訊的可見性與功能界線,而不是不斷新增涵蓋範圍更廣的關鍵字規則。
完成比對測試後,應切回原本預計使用的模式並再測試一次。暫時使用 Proxy 確認連線後忘記切回 Config,是「規則看起來沒有生效」的常見原因;暫時切到 Direct 後忘記復原,也會造成類似誤判。將目前模式、伺服器與檔案記錄在同一筆測試紀錄中,通常比保留大量缺乏脈絡的成功截圖,更有助於後續維護。
比對順序與 FINAL:命中第一條後即停止
閱讀 Rule 最重要的方法,就是由上而下逐行判斷。請求命中一條適用規則後,就會採用對應策略,不會為了尋找「更具體」的規則而繼續往下比對。DOMAIN 不會自然優先於 DOMAIN-SUFFIX,網域規則也不會只因類型名稱而自動優先於位址規則。所謂優先順序,首先取決於規則在設定檔中的位置;理解這一點,比記住更多規則關鍵字更能避免設定錯誤。
將例外放在概括規則之前
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
此片段先為 api.example.com 設定代理例外,再將同一網域下的其他請求交由 DIRECT,接著處理私有位址與 CN 位址分類,最後以 PROXY 作為兜底。每一行都有各自用途。若將後綴規則移到第一行,api.example.com 會先命中 DIRECT,後面的精確例外便沒有機會生效。即使兩行之間插入註解或空行,也不會改變先後順序。
「例外在前」不是要求將所有 DOMAIN 都放在整個檔案最上方,而是要求在相同判斷範圍內,窄範圍規則先於寬範圍規則。實際整理時可依用途分組,但必須檢查不同群組之間是否重疊。例如,較前面的 DOMAIN-KEYWORD 可能已涵蓋後續多個業務網域;某個位址範圍規則也可能涵蓋之後希望特殊處理的目標。分組標題有助閱讀,但不會替客戶端建立新的優先順序層級。
FINAL 的結構與位置
[Rule]
DOMAIN-SUFFIX,example.com,DIRECT
FINAL,PROXY
FINAL 是用來處理先前都未命中的請求的兜底規則,寫法只有類型與策略,不需要再加網域或位址欄位。通常應放在 Rule 節末尾。若太早寫入 FINAL,後續一般規則就沒有機會處理其餘請求。檔案中若有多個 FINAL,也不應將它們視為逐層備援出口;應整理成一個明確的最終選擇,再以前面的具體規則設定例外。
FINAL,PROXY 與 FINAL,DIRECT 代表不同的預設行為,不能一概而論哪一種才正確。前者會將未分類請求交由代理策略處理,後者則將未分類請求直接連線。應依預期的預設路徑,以及前面的例外是否完整來選擇。複製設定時尤其要檢查最後一行:即使前面大多數規則都相同,只要更改兜底策略,也可能讓許多未列出的目標使用不同出口。
手動逐行推演,找出涵蓋關係
檢查一組規則時,挑選幾個代表性目標逐行推演:精確例外是否命中第一行,同一網域的其他主機是否落入後綴規則,私有位址是否進入位址規則,其餘請求最後是否到達 FINAL。每次推演都記下停止的位置,而不只是預期策略。這樣既能找出衝突,也能說明為何某條看似正確的規則從未出現在命中記錄中。
位址規則參與判斷時,還要註明是否已有目標位址,以及 no-resolve 是否讓該行不主動解析。只有網域文字、沒有位址脈絡的紙上推演,無法可靠預測 GEOIP 的實際結果。若記錄結果與推演不同,應優先確認客戶端看到的目標資訊,再檢查目前生效的檔案。不要為了讓位址規則有機會命中,就刪除所有網域規則。
合併兩份設定檔,不是直接把 Rule 內容接在一起。第一份中的 FINAL 可能會攔截第二份所有規則,範圍較廣的關鍵字也可能提早涵蓋第二份的例外。正確做法是先拆分各節、移除兜底規則,再依用途合併具體規則,最後加入一個 FINAL。相同對象使用不同策略時,必須人工決定;確認語意一致後,才可清理完全相同的重複行。
維護長篇設定檔時,建議將新增規則以小幅變更方式加入本機副本,並記錄插入位置、涵蓋對象、預期策略與測試結果。運作一段時間後再合併同類項,避免每次排查都把新規則堆在最前面。規則順序應維持清楚易懂;若只有維護者本人記得某行為何放在此處,後續更新與故障復原都會變得困難。
Host 與 URL Rewrite:位址對應與請求處理
Host、URL Rewrite 與 Rule 經常出現在同一個設定檔中,但不能用同一套方式理解。Host 為指定主機名稱設定靜態位址對應,URL Rewrite 依據可辨識 URL 的比對條件執行相應處理,Rule 則選擇連線策略。三者分別涉及「位址來源」、「請求處理方式」與「連線路徑」。若一個問題牽涉多個層面,應分開驗證各層是否符合預期。
Host:固定解析結果不等於指定出口
[Host]
service.example.com = 192.0.2.10
此處將 service.example.com 對應到示例位址 192.0.2.10。該位址屬於文件專用示例位址範圍,並非可供連線的服務。Host 行使用等號,不採用 Rule 的逗號結構,也不能直接在後面加上 PROXY 來指定策略。若同一目標還需要特定連線方式,應另外在 Rule 中設定規則,並透過實際連線記錄確認目標位址與策略都符合預期。
Host 適合用於目標位址明確且能持續維護的情境,不適合任意固定經常變動的公用服務位址。網域背後可能有跨地區調度、故障切換或位址輪替;固定單一位址會略過這些變化,也可能在一段時間後失效。新增對應時,應記錄用途、預期有效條件與移除方式,而不是把某次解析得到的位址直接當成長期修復方案。
HTTPS 請求中的網域也會參與憑證驗證與服務選擇。即使對應位址能建立 TCP 連線,目標服務仍可能因憑證、SNI 或虛擬主機設定而拒絕請求。Host 對應不會讓任意位址自動取得該網域的有效憑證,也不會變更伺服器驗證參數。遇到憑證錯誤時,應檢查目標服務設定,不能以關閉驗證取代確認位址是否正確。
URL Rewrite:先確認比對範圍
[URL Rewrite]
^http://example\.com/old$ http://example.com/new 302
上例示範如何針對明文 HTTP 的特定路徑執行重新導向:正規表示式比對舊位址,目標 URL 指向新位址,302 表示暫時重新導向。這不是網域分流規則,不能放在 Rule 節中。將句點寫成反斜線加句點,是為了表示網域分隔點本身;開頭與結尾的錨點則用來限制範圍,避免更長路徑或額外字元也符合範例條件。
URL 中的查詢參數也會影響比對結果。上述結尾的美元符號表示帶有額外查詢字串的位址不在此範例的精確範圍內;是否允許查詢字串,應依實際需求重新設計表示式。不要只為了「讓所有項目都命中」就任意刪除界線或加入寬鬆的萬用比對。修改前先列出應命中與不應命中的範例,再逐一驗證,有助於找出路徑、參數與跳脫字元之間的差異。
HTTPS 可見性與循環風險
網域可以用來分流,不代表加密請求的完整路徑與請求標頭自然可見。對 HTTPS 而言,路徑位於加密內容中,不能只靠網域規則推定 URL Rewrite 一定能處理。若要進一步處理加密內容,必須另外了解憑證信任、適用網域與隱私影響;本頁選用 HTTP 作為範例,就是為了不把這些額外前提隱藏在看似簡單的重寫片段中。
重寫規則也可能形成循環:舊位址指向新位址,新位址又被另一條規則改回舊位址,瀏覽器便會不斷重試,或顯示重新導向次數過多。也可能因目標位址仍符合原比對表示式,導致同一條規則反覆作用。測試時應觀察完整跳轉鏈,而不只看最後頁面是否出現;若無法解釋鏈中的每一步,應先縮小表示式範圍並暫時移除相關重疊規則。
驗證 Host 時,保持原有 Rule 不變,只比較目標位址來源;驗證 URL Rewrite 時,先用明確的 HTTP 測試位址確認重新導向,再檢查目標位址的分流結果。若同時修改三個節,即使最後成功,也很難確認各項設定的相依關係。對正常業務請求,盡量保留原始設定檔副本,避免測試規則影響登入返回、表單提交或其他帶有狀態的請求。
來源更新後,也應重新檢查 Host 與 URL Rewrite,不能只確認 Rule 是否有變化。位址對應可能已過期,服務路徑可能已調整,過去必要的重寫規則也可能與新行為衝突。維護記錄至少應包含目標、用途與撤銷條件;對於無法說明來源與目的的項目,先在副本中停用並測試,再決定是否刪除,比長期保留不明規則更容易控制影響。
驗證與維護:從單一請求定位單一變更
驗證設定的目標不是證明「這份檔案看起來完整」,而是讓每種預期行為都能透過實際請求說明。一次有效測試至少應記錄目前網路、Global Routing 模式、Config 檔案、所選伺服器、目標網域與觀察結果。缺少這些脈絡時,同一頁面前後兩次表現不同,很可能是快取、舊連線、網路變化或出口切換造成,而非剛編輯的規則所致。
依四個層次縮小問題範圍
第一層確認請求是否在目前客戶端的處理範圍內,包括連線開關、系統授權與使用中的檔案是否正確。第二層確認目標資訊是否可用,包括網域與位址。第三層確認命中規則與策略是否符合預期。第四層才檢查策略對應的路徑是否能完成連線。依此順序檢查,可避免伺服器明明可用,卻因誤命中 REJECT 而一再重新填寫參數。
Connectivity Test 可協助觀察連線條件,但測試成功不代表實際服務請求的所有相依條件都已滿足。不同測試方式使用的目標與協定可能不同,網頁也可能請求多個網域。網站發生異常時,應選出一個具體的失敗請求,檢查其網域、位址、命中規則與失敗階段,再回頭檢視整體頁面行為。Data 中的統計適合用來觀察使用情況,不適合單獨證明某條規則是否命中。
| 觀察結果 | 先檢查 | 下一步 |
|---|---|---|
| 規則沒有命中 | 目前檔案、模式與前置規則 | 使用實際網域逐行推演 |
| 命中 PROXY 仍無法連線 | 所選出口與伺服器參數 | 固定目標,比對 Proxy 模式 |
| 命中 DIRECT 仍無法連線 | 目前網路與目標連線能力 | 檢查目標位址、連接埠與解析結果 |
| 只有更新後才發生異常 | 檔案變更與出口選擇 | 逐項比對更新前的副本 |
採用可復原的最小變更
每次只修改一條規則或一項相關設定,並保留修改前後的片段。若測試結果沒有變化,先確認請求是否重新建立、是否命中其他更前面的規則,再決定要復原或繼續調查。不要不斷新增例外,卻不移除無效嘗試;這會讓下一次測試面臨更多變數。設定檔較長時,可先在副本中只保留必要的 General 與少量 Rule,建立能重現問題的最小範圍。
[General]
bypass-system = true
dns-server = system
[Rule]
DOMAIN,api.example.com,PROXY
FINAL,DIRECT
此診斷片段只將一個示例網域交由 PROXY 處理,其餘請求預設使用 DIRECT,目的是凸顯觀察對象,並非建議長期採用的通用設定。套用前必須了解預設策略變更會影響其他請求。若測試結果符合預期,再將原設定檔中相關規則分組加回,找出是哪一組改變了命中結果。若仍然失敗,應繼續檢查網域資訊、代理出口與目標服務,而不是直接擴大比對範圍。
更新、備份與敏感資訊處理
設定備份應與伺服器訂閱資訊分開保存。有些檔案可能包含伺服器、驗證欄位或帶有身分資訊的連結;即使主要內容看起來只有規則,分享前仍應完整檢查。提供疑難排解資料時,保留節名、規則類型、欄位結構與順序,並視需要將實際網域替換為 example.com,同時移除帳號與訂閱資訊。不要只遮住截圖中的一小部分,卻忽略其他可識別欄位。
App 更新透過 App Store 進行;取得 App 與確認正版的方法,請參閱正版驗證說明。設定更新則取決於你實際使用的檔案來源。兩種更新不應混為一談,也不要只因 App 更新後第一次瀏覽失敗,就推斷規則語法有所變更。先比對檔案、模式、伺服器與網路,再確認具體設定項目是否仍符合 App 內的說明。
對於服務商提供的訂閱,更新前後應確認伺服器項目是否更名、參數是否調整,以及原先的選擇是否仍有效。單一分享連結與訂閱連結的用途不同;若無法判斷匯入的項目類型,請參閱分享連結與訂閱連結的差異。本頁僅討論如何使用既有資訊;伺服器與訂閱內容仍應向你的服務商取得。
最後進行一輪回歸測試:精確例外、網域後綴、私有位址與 FINAL 各選一個代表目標,確認策略結果;若使用 Host 或 URL Rewrite,也要分別檢查位址對應與跳轉鏈。測試完成後,切回預計使用的 Global Routing 模式,並保留可復原的副本。常見連線問題可繼續參閱使用說明;流量數據的計算方式請見Data 流量統計說明。以可重現的請求與清楚的變更記錄維護設定,比持續新增規則更有效。