跨網域請求時什麼情況下會發送preflight request

當我們跨網域呼叫API時,瀏覽器會自動先發送一個method是OPTIONS的Preflight request,向後端確認是否允許跨網域請求,若可以才會繼續原本請求的request。但有時候明明就是跨網域請求,卻沒發送OPTIONS,到底為什麼呢?

問題就在於我們的請求必須是「非簡單請求」,才會讓瀏覽器發送 Preflight Request。那什麼是「非簡單請求」呢?定義為「只要滿足下列任一條件」就是「非簡單請求」:

  1. 當method「非」GET, POST, HEAD。
  2. header中有 user agent 自動設定的標頭「以外」的標頭。例如:authorization。
  3. Content-Type 「非」這三種之一 application/x-www-form-urlencoded, multipart/form-data, text/plain。

那如果我們故意用「簡單請求」做跨網域請求,會發生什麼事?

在client端送出GET與POST(但不POST任何資料)的情況下,後端還是可以收到東西。因為送出時,瀏覽器會當作一般的請求,不會發出Preflight Request去確認是否可跨網域,因此不會被擋掉。只是當server端回應時,因為沒有回應跨網域的header資訊,所以會被瀏覽器擋掉,client端會收不到response。

用express測試的結果,GET一定會收到Request。POST的情況有點不同,如果沒有帶任何資料,也會收到Request,但如果有Post資料的時候,就會被擋掉。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料