在跨網域存取(CORS)迷霧中的錯覺與啟示

更新於 發佈於 閱讀時間約 2 分鐘

在進行前後端分離架構的開發過程中,我們配置了`www.domain.site`作為前端展示頁面,並將`api.domain.site`設置為後端API服務。這種架構要求前端從不同的源發出請求到後端服務器,這裡就涉及到了跨域請求的處理。


為什麼有這篇

我的困擾來自於在實際測試中發現,當使用`application/json`與`application/x-www-form-urlencoded`這兩種不同的Content-Type進行POST請求時,行為竟然迥異。這讓我意識到了「簡單請求」和「預檢請求」之間的關鍵區別,並且整理出這篇內容,就是要分享我在這個過程中的探索與解決方法,希望能幫助同樣遇到此類問題的開發者。


簡單請求(Simple Requests)

當我們發送一個HTTP請求,如果該請求符合以下條件,則被認為是「簡單請求」:

  1. 使用GET、HEAD或POST方法。
  2. HTTP標頭限於幾種指定的欄位。
  3. 若有Content-Type,也僅限於三種:`text/plain`、`multipart/form-data`或`application/x-www-form-urlencoded`。

簡單請求不會觸發CORS預檢,因此,使用`application/x-www-form-urlencoded`時,我發現請求能夠直接發送且順利獲得回應。


預檢請求(Preflighted Requests)

但當我將Content-Type改為`application/json`,情況就大不相同了。這種設定下的請求不再被視為簡單請求,瀏覽器會首先發出一個OPTIONS請求作為預檢,向伺服器確認是否允許實際的請求。這就是我所說的「預檢請求」。

raw-image




解決方法

面對這個痛點,我們需要在後端服務器上進行適當的設定:


  1. 透過設置`Access-Control-Allow-Origin`來指明允許哪些來源的請求。
  2. 使用`Access-Control-Allow-Headers`來包含`Content-Type`,並明確允許`application/json`。
  3. 確保伺服器能夠處理OPTIONS方法的請求,並對這類預檢請求提供正確的CORS響應。
raw-image



要怎麼判斷CORS是否設定成功呢?你會注意到,在我分享的「預檢請求」截圖中,狀態欄顯示的204和我圈出來的「回傳204」實際上是指同一件事情。當你在網路開發者工具中看到「預檢請求」的狀態碼為204,這表示你的CORS的OPTIONS請求已經成功通過了。


這篇文章的撰寫,旨在分享我在處理跨域請求時的經驗心得。我希望透過我的探索與解決方案,能夠幫助到其他開發者,更有效地理解並處理跨域請求中遇到的問題。

留言
avatar-img
留言分享你的想法!
普普文創-avatar-img
2024/03/06
不錯呢。這對開發、對程式設計都有好處。謝謝分享。
avatar-img
詹姆士的軟體易開罐
27會員
88內容數
這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
2025/01/14
「如果資料庫出問題,能不能快速恢復?」 這或許是許多工程師在面對資料庫維運時心中的疑問。就我而言,遇到伺服器故障或有人誤刪資料表時,最慶幸的就是事先做好備份。這次要分享的是 MySQL 中常用的備份指令 mysqldump,讓大家能在需要時把握關鍵的「救命繩」。 為什麼需要備份? 在商業專案
Thumbnail
2025/01/14
「如果資料庫出問題,能不能快速恢復?」 這或許是許多工程師在面對資料庫維運時心中的疑問。就我而言,遇到伺服器故障或有人誤刪資料表時,最慶幸的就是事先做好備份。這次要分享的是 MySQL 中常用的備份指令 mysqldump,讓大家能在需要時把握關鍵的「救命繩」。 為什麼需要備份? 在商業專案
Thumbnail
2024/08/25
這篇文章反映了平台改版後使用者面臨的多項問題,包括文章編輯功能異常、分類顯示異常及最新內容資料呈現問題。本人從個人經驗出發,詳細描述了這些問題的具體情況,期望官方重視使用者反饋,以改善平台使用體驗。
2024/08/25
這篇文章反映了平台改版後使用者面臨的多項問題,包括文章編輯功能異常、分類顯示異常及最新內容資料呈現問題。本人從個人經驗出發,詳細描述了這些問題的具體情況,期望官方重視使用者反饋,以改善平台使用體驗。
2024/07/20
2024年7月19日…,一場前所未有的全球性大事件悄然降臨。這次事件波及了機場、車站,以及無數依賴關鍵系統的商店與公司。聽起來像是科幻小說中的場景,然而,這真真切切地發生在昨天。世界各地的運營陷入混亂,人們的生活被突如其來的技術故障打亂。 這一切都要從一間公司開始說起——CrowdStrike
Thumbnail
2024/07/20
2024年7月19日…,一場前所未有的全球性大事件悄然降臨。這次事件波及了機場、車站,以及無數依賴關鍵系統的商店與公司。聽起來像是科幻小說中的場景,然而,這真真切切地發生在昨天。世界各地的運營陷入混亂,人們的生活被突如其來的技術故障打亂。 這一切都要從一間公司開始說起——CrowdStrike
Thumbnail
看更多
你可能也想看
Thumbnail
家中修繕或裝潢想要找各種小零件時,直接上網採買可以省去不少煩惱~看看Sylvia這回為了工地買了些什麼吧~
Thumbnail
家中修繕或裝潢想要找各種小零件時,直接上網採買可以省去不少煩惱~看看Sylvia這回為了工地買了些什麼吧~
Thumbnail
👜簡單生活,從整理包包開始!我的三款愛用包+隨身小物清單開箱,一起來看看我每天都帶些什麼吧🌿✨
Thumbnail
👜簡單生活,從整理包包開始!我的三款愛用包+隨身小物清單開箱,一起來看看我每天都帶些什麼吧🌿✨
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
AWS CloudFront + S3 遇到 CORS 解決方式
Thumbnail
AWS CloudFront + S3 遇到 CORS 解決方式
Thumbnail
在API介接中使用x-www-form-urlencoded格式時,可能會遇到一些踩坑的情況,本文分享了作者在這方面遇到的問題和解決方法。
Thumbnail
在API介接中使用x-www-form-urlencoded格式時,可能會遇到一些踩坑的情況,本文分享了作者在這方面遇到的問題和解決方法。
Thumbnail
之前在【什麼是網路請求(HTTP response)】筆記裡有提到,網路請求遇到 CORS 跨域問題,在開發時可以透過 vite 的反向代理來解決,那麼什麼是反向代理,有反向代理的話是不是也有正向代理呢?
Thumbnail
之前在【什麼是網路請求(HTTP response)】筆記裡有提到,網路請求遇到 CORS 跨域問題,在開發時可以透過 vite 的反向代理來解決,那麼什麼是反向代理,有反向代理的話是不是也有正向代理呢?
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
Thumbnail
先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News