Charles Proxy Reverse Proxy 設定視窗,包含本機 port 與遠端 host 設定

← INSIGHTS & PERSPECTIVES | 後端開發

使用 Charles Proxy 抓取 Node.js 網路請求:Reverse Proxy 設定教學

說明如何用 Charles Proxy 抓取 Node.js HTTP 與 HTTPS 請求:Reverse Proxy 設定、Node.js 22.21 與 24 以上用 NODE_USE_ENV_PROXY 免改程式碼的做法,以及信任 Charles 憑證的安全設定。

使用 Charles Proxy 抓取 Node.js 網路請求時,我最常用的方法是開 Charles Proxy 的 Reverse Proxy,讓 Node.js 原本要連到遠端主機的 request 改連 localhost 的指定 port。Charles Proxy 再把流量轉送到真正的遠端主機,這樣就能在 Charles Proxy 裡看到 request 與 response。

如果你用的是 Node.js 22.21 或 24 以上的版本,還有一個更省事的選擇:設定 NODE_USE_ENV_PROXY=1,讓 Node.js 內建的 fetch() 和 http/https 模組直接走 Charles Proxy,完全不用改程式碼。兩種做法都整理在下面。

為什麼 Node.js 請求適合用 Charles Proxy Reverse Proxy 抓?

Charles Proxy Reverse Proxy 適合用在 client application 不方便設定 HTTP proxy 的情境。Node.js 服務只要能改 host 與 port,就能把流量導進 Charles Proxy,再由 Charles Proxy 轉送到遠端伺服器。

Charles Proxy 的官方文件說明,Reverse Proxy 會在本機 port 建立一個 web server,透明地把請求代理到遠端 web server,並讓 Charles Proxy 記錄所有 request 與 response(Charles Proxy Documentation,Reverse Proxy,存取日期 2026-08-28)。這個特性很適合後端除錯,因為 Node.js 程式通常不像瀏覽器一樣會自動套用系統代理設定。

我通常在這幾種情境使用 Charles Proxy Reverse Proxy:

情境為什麼適合
Node.js 服務呼叫外部 API可以看到實際送出的 path、header、body 與 response
SDK 或第三方套件內部發 request不必改 SDK,只要把 endpoint 指到本機 port
本機除錯 HTTP 或 HTTPS 問題可以快速確認 request 是否真的送出、參數是否符合預期
client 不支援 proxy 設定用本機 port 包一層,比找 proxy hook 更直接

Charles Proxy 要怎麼設定 HTTP Reverse Proxy?

Charles Proxy HTTP Reverse Proxy 的設定重點是指定一個未使用的 Local Port,再填入真正的 Remote Host 與 Remote Port。Node.js 之後只連 Local Port,Charles Proxy 負責轉送。

先在 Charles Proxy 裡開啟 Reverse Proxies:

  1. 打開 Charles Proxy。
  2. 點選選單 Proxy -> Reverse Proxies...。
  3. 勾選 Enable Reverse Proxies。
  4. 新增一筆 reverse proxy 設定。
Charles Proxy 的 Proxy 選單中可以找到 Reverse Proxies 設定

以 claire-chang.com 為例,我會這樣填:

欄位設定值說明
Local Port60103任意未被佔用的本機 port
Remote Hostclaire-chang.comNode.js 原本要連線的目標主機
Remote Port80HTTP 通常使用 80
Charles Proxy Reverse Proxy 設定本機 port 60103 並轉送到 claire-chang.com:80

Charles Proxy 官方文件也提到,HTTP 目的地通常使用 port 80,HTTPS 目的地通常使用 port 443;若建立 HTTPS reverse proxy,client 也要用 HTTPS 連到本機位置(Charles Proxy Documentation,Reverse Proxy,存取日期 2026-08-28)。

Node.js 程式要怎麼改連 Charles Proxy?

Node.js 程式要改連 Charles Proxy 時,把原本的遠端 host 改成 localhost,port 改成 Charles Proxy Reverse Proxy 的 Local Port。path、method、header 與 body 可以照原本 API 呼叫邏輯保留。

如果原本 Node.js 連線目標是:

http://claire-chang.com/api/example

設定 Charles Proxy Reverse Proxy 後,Node.js 端改成:

const options = {
  host: "localhost",
  port: 60103,
  path: "/api/example",
  method: "GET",
};

重點不是把 API path 改掉,而是把主機與 port 換成 Charles Proxy 開在本機的入口。Charles Proxy 收到 localhost:60103 的請求後,會把同一個 request 轉送到 claire-chang.com:80。

我的檢查順序通常是:

  1. 先確認 Charles Proxy 的 recording 有開。
  2. 確認 Node.js 連的是 localhost 與 Local Port。
  3. 確認 Charles Proxy session 裡有出現新的 request。
  4. 若沒有 request,先檢查 port 是否被其他程式佔用。
  5. 若有 request 但 response 異常,再看 Remote Host、Remote Port、path 是否一致。

Node.js 22.21 或 24 以上可以不改程式碼嗎?

可以。Node.js 從 22.21.0 與 24.5.0 起內建 proxy 支援,只要設定 NODE_USE_ENV_PROXY=1,Node.js 就會讀取 HTTP_PROXY、HTTPS_PROXY、NO_PROXY 環境變數,把 fetch() 和 http/https 模組的請求送到指定的 proxy(Node.js Documentation,Built-in Proxy Support,存取日期 2026-09-25)。fetch() 的支援更早,在 24.0.0 就已經加入。

這表示 Charles Proxy 可以當一般的 HTTP proxy 使用,不需要設定 Reverse Proxy,也不用把程式裡的 host 改成 localhost。Charles Proxy 預設的 proxy port 是 8888,可以在 Proxy -> Proxy Settings... 確認。

NODE_USE_ENV_PROXY=1 \
HTTP_PROXY=http://127.0.0.1:8888 \
HTTPS_PROXY=http://127.0.0.1:8888 \
node app.js

也可以用命令列參數 --use-env-proxy 取代 NODE_USE_ENV_PROXY=1,兩者效果相同。

這個環境變數一定要設。 我在 Node.js 22.22.2 用一個本機 proxy 實測,只設 HTTP_PROXY 的時候,fetch() 完全不理會這個設定,直接嘗試連線目標主機;加上 NODE_USE_ENV_PROXY=1 之後,fetch() 和 http.get() 的請求都有經過 proxy。舊教學常說「設好 HTTP_PROXY 就行」,但 Node.js 本身長期不讀這個變數,這也是過去只能改用 Reverse Proxy 的原因。

實測時還觀察到兩個細節:

細節說明
fetch() 走 CONNECT 通道即使目標是 HTTP,fetch() 也是先對 proxy 送出 CONNECT host:port,http.get() 則是送一般的 proxy 請求。Charles Proxy 兩種都支援,但自己寫的簡易 proxy 要記得處理 CONNECT
會出現 experimental 警告Node.js 22 會印出 EnvHttpProxyAgent is experimental 警告,這個功能在官方文件中的穩定度仍是 1.1(Active Development),適合本機除錯,不建議當成正式環境的依賴

兩種做法怎麼選:

情境建議做法
Node.js 22.21 或 24 以上,只想暫時看一下請求內容NODE_USE_ENV_PROXY=1,不用改程式碼
舊版 Node.jsReverse Proxy
使用 axios 等自帶 HTTP agent 的套件先試 NODE_USE_ENV_PROXY=1,沒有經過 Charles Proxy 時改用 Reverse Proxy 或套件本身的 proxy 設定
只想抓某一個 API,不想被其他請求干擾Reverse Proxy,或用 NO_PROXY 排除不需要的主機

HTTPS 請求要注意什麼?

Charles Proxy 抓 Node.js HTTPS 請求時,常見問題是憑證驗證。NODE_TLS_REJECT_UNAUTHORIZED=0 可以讓 Node.js 不驗證 TLS 憑證,但這只適合本機除錯,不應放進正式環境。

如果目標是 HTTPS,Reverse Proxy 的 Remote Port 通常要改成 443,Node.js 連本機時也要使用 HTTPS URL。Charles Proxy 文件明確說明,HTTPS reverse proxy 要用 https://localhost:<port>/ 連入(Charles Proxy Documentation,Reverse Proxy,存取日期 2026-08-28)。

本機快速測試時,我曾經用這行讓 Node.js 接受不明憑證:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

Node.js 官方文件說明,當 NODE_TLS_REJECT_UNAUTHORIZED 設為 0 時,TLS 連線會停用憑證驗證,這會讓 TLS 與 HTTPS 變得不安全,因此官方強烈不建議使用這個環境變數(Node.js Documentation,Command-line API,存取日期 2026-08-28)。

比較安全的做法是讓 Node.js 信任 Charles Proxy 的根憑證,而不是關掉整個憑證驗證:

  1. 在 Charles Proxy 選 Help -> SSL Proxying -> Save Charles Root Certificate...,存成 .pem 格式(例如 charles.pem)。
  2. 用 NODE_EXTRA_CA_CERTS 指向這個檔案啟動 Node.js,Node.js 會把它加進原本信任的憑證清單,其他憑證驗證仍然正常運作:
NODE_EXTRA_CA_CERTS=./charles.pem node app.js
  1. 如果搭配上一節的 NODE_USE_ENV_PROXY=1 抓 HTTPS,還要在 Charles Proxy 的 Proxy -> SSL Proxying Settings... 把目標主機加進清單,否則 Charles Proxy 只會看到加密的 CONNECT 連線,看不到 request 內容。

NODE_TLS_REJECT_UNAUTHORIZED=0 只適合幾分鐘的快速測試,而且不要 commit 到專案。

我會怎麼判斷設定是否成功?

Charles Proxy Reverse Proxy 設定成功時,Node.js request 會出現在 Charles Proxy session list 裡,而且目標 path、header、query string 與 response body 都能被檢查。若只看到連線錯誤,通常是 host、port 或 HTTPS 憑證問題。

我會用這張表快速排查:

現象優先檢查
Charles Proxy 完全沒有出現 requestNode.js 是否真的改連 localhost 與 Local Port
Node.js 回報 ECONNREFUSEDLocal Port 是否填錯,或 Charles Proxy Reverse Proxy 是否未啟用
Charles Proxy 有 request 但遠端連不上Remote Host、Remote Port 是否填對
HTTP 可以,HTTPS 失敗Node.js 是否用 HTTPS 連本機,以及 TLS 憑證是否被信任
request path 不符合預期Node.js 程式是否同時改到了 path 或 base URL

這個方法的好處是改動很小:只要把 Node.js endpoint 暫時改成 localhost:<Local Port>,除錯結束後再切回原本設定。對於只想確認 request 內容的情境,Charles Proxy Reverse Proxy 比在程式碼裡到處加 log 乾淨很多。

常見問題

Charles Proxy 抓 Node.js 網路請求的常見問題,多半集中在 Reverse Proxy 與 TLS 憑證。先把 HTTP 流程跑通,再處理 HTTPS,會比一開始就同時排查所有問題穩定。

QCharles Proxy 可以直接抓 Node.js 的所有網路請求嗎?

要看 Node.js 版本。Node.js 預設不會使用系統代理,也不會讀 HTTP_PROXY。Node.js 22.21 或 24 以上可以設定 NODE_USE_ENV_PROXY=1,讓 fetch() 與 http/https 模組走 Charles Proxy;更舊的版本則改用 Reverse Proxy,把 host 與 port 暫時改到 localhost:<Local Port>。

Q只設定 HTTP_PROXY 環境變數,Node.js 會走 proxy 嗎?

不會。實測 Node.js 22.22.2 只設 HTTP_PROXY 時,fetch() 會直接連目標主機。必須同時設定 NODE_USE_ENV_PROXY=1,或啟動時加上 --use-env-proxy。

QLocal Port 一定要用 60103 嗎?

不用。60103 只是範例,Local Port 可以換成任何未被佔用的本機 port。重點是 Charles Proxy Reverse Proxy 設定的 Local Port,要和 Node.js 程式改連的 port 完全一致。

QRemote Host 要不要加 http:// 或 https://?

不要。Charles Proxy Reverse Proxy 的 Remote Host 填主機名稱即可,例如 claire-chang.com。通訊協定主要由 Remote Port 與 client 連入本機時使用 HTTP 或 HTTPS 來決定。

QNode.js HTTPS 請求一直出現憑證錯誤怎麼辦?

先確認 Charles Proxy 的 HTTPS reverse proxy 是用 https://localhost:<Local Port>/ 連入。接著從 Charles Proxy 匯出根憑證(Help -> SSL Proxying -> Save Charles Root Certificate...),用 NODE_EXTRA_CA_CERTS 讓 Node.js 信任它。NODE_TLS_REJECT_UNAUTHORIZED=0 會停用所有憑證驗證,只適合短暫測試,不應放到正式環境。

QCharles Proxy 有看到 request,但 response 不是預期內容怎麼查?

先看 Charles Proxy session 裡的 host、port、path 是否和目標 API 一致。若 host 與 port 正確,再檢查 Node.js 是否保留原本的 path、query string、method、header 與 body。Reverse Proxy 只負責轉送,API 參數仍然由 Node.js 程式決定。

參考資料

本文的外部參考以官方文件為主。Charles Proxy Reverse Proxy 與憑證匯出流程依 Charles Proxy 文件核對,Node.js 的 proxy 與 TLS 環境變數依 Node.js 官方文件補充。

延伸閱讀

最後更新

2026-09-25:新增 Node.js 22.21 與 24 以上用 NODE_USE_ENV_PROXY 免改程式碼的做法與實測結果,HTTPS 改為建議用 NODE_EXTRA_CA_CERTS 信任 Charles 根憑證。

2026-08-28:補上 Charles Proxy Reverse Proxy 的操作說明、Node.js HTTPS 憑證風險提醒、FAQ、參考資料與延伸閱讀。

關於作者

Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。

首次發布:2020-02-27