使用 Cloudflare Workers 處理前端跨域問題

在 Web Application 走前後端分離的開發時,常會遇到 CORS 的問題,先科普什麼是 CORS,請參考:

除了使用 JSONP 的處理方式以外,較快的解決方法有:

  1. 前端架設一個 proxy server 提供給前端呼叫使用
  2. 後端 server 端透過 nginx 或其他方法允許跨域的 request

兩個方法都存在著,正式環境和測試環境在環境設定上必然有所不同,就差在前端改還是後端改了。

而架設 proxy server 的方法也有兩個常見的作法:

  1. 本地環境架設一個 porxy server ,這邊提供一個 vue+ vite 的範例,請參考
  2. 架設一個在網路上的 proxy server

原則上來說第一種方式比較保險的,但可能有種種技術因素導致無法實現,於是第二種方法,我們透過 Cloudfalre 來實現了。

原始碼和別人寫的說明附在最下方,直接講注意事項:

  1. 你需要一個 Cloudflare 帳號,並且有存取 Workers and Pages 這個服務的權限。
  2. 使用 Worker 服務實作,他是公開的,且免費版有 100k 的次數限制,記得要設定白名單避免被濫用
  3. 要記得前端呼叫的網域要透過環境區分,把這個放上正式環境,呼叫次數可能會爆掉。

更新一些要注意的事項:

  1. 白名單是 request header 中的 Origin ,是來源網址不是 proxy 導向的網址。這如果是後端架設的話得和前端溝通是哪個網址來源。
  2. 針對 Worker 裡面的 fix() 方法我做了一些修改,如果有錯誤還請提醒,程式碼如下:
function fix(myHeaders) {
  // myHeaders.set("Access-Control-Allow-Origin", "*");
  myHeaders.set("Access-Control-Allow-Headers", event.request.headers.get("access-control-request-headers"));
  myHeaders.set("Access-Control-Allow-Origin", event.request.headers.get("Origin"));
  if (isOPTIONS) {
    myHeaders.set("Access-Control-Allow-Methods", "GET,HEAD,POST,OPTIONS");

    //myHeaders.set("Access-Control-Allow-Credentials", "true");

    // myHeaders.delete("X-Content-Type-Options");
  }
  return myHeaders;
}

我 fork 專案,更新了一個在 header 帶 auth 的版本,應該對防止濫用更有幫助。 網址如下:

用法在下面兩個連結分享中有說明了,簡單來說就是一個 proxy for api

這是 cloudflare-cors-anywhere 來源:

這是關於 cloudflare-cors-anywhere 的操作教學:

同場加映:

這裡有修改 response header 的方法,不太推薦,很容易忘記。


已發佈

分類:

作者: