標籤: CORS

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

    使用 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 的方法,不太推薦,很容易忘記。