CORS 筆記

嗯,我要串接 xkcd 的 API,但要命<span hidden>,這 API 伺服器好像沒有給到我需要的東西這真要了我的命……</span>…我花了好幾小時在處理 CORS 問題……

總之,我沒辦法串接 xkcd 的 API 了。真可惜,不過講點 CORS 好了。


一般來說,瀏覽器會禁止來自其他網域的資源,除非有取得網域資源的權限。這份權限就稱作 CORS。而 CORS 有兩種授權方法:simple 與 preflighted:simple 可以直接對伺服器請求,而 preflighted 則需要徵求伺服器同意。

以下條件全部集滿,才能發動 simple 授權,否則將為 preflighted 授權:

  1. HTTP 方法只能是 GETHEADPOST 其中之一。
  2. HTTP 標頭只有 ConnectionUser-Agentforbidden header nameCORS-safelisted request-header 標頭。
  3. HTTP Content-Type 標頭只能是 application/x-www-form-urlencodedmultipart/form-datatext/plain 其中之一。

simple 授權會在請求標頭內多出 Origin 標頭,回應則多出 Access-Control-Allow-Origin 標頭;<br /> preflighted 授權則會先發動 OPTIONS 請求,待回應後再發起含有 Origin 標頭的請求。


jQuery AJAX 雖然有 type : "jsonp" API 能用,但那樣會讓純 JSON 檔案出問題。所以還是要想辦法完成 CORS…axios 大概也是這樣……


最糟糕的其實是把遞歸寫壞,結果瀏覽器載到死掉……

參考資料