在跨網域存取(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請求已經成功通過了。


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

這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,作者都用幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
留言0
查看全部
發表第一個留言支持創作者!
追求乾淨的程式碼是好的開始,但不要陷入過度設計的陷阱,導致程式難以維護。實際上,考慮團隊狀況和專注於解決真正的問題更為重要。了解公司的規模和現實情況,適時調整工作重心。技術不斷進步,使得寫程式變得更加容易,但這並不意味著工程師的角色會消失。在選擇技術時,也要考慮隱形成本有時簡單的解決方案反而更有效。
每當看到相關的技術年會訊息,我總會想起大學時參加過的研討會,那種滿滿的熱情和期待。每次看到駭客年會的消息,都會讓我想起那段坐在會議廳中聽著台上講者所分享的技術。所以,我今天想來分享一下今年台灣的技術年會情報。
本篇文章為Laravel初學者提供了一個指南,深入探討了Laravel的routes目錄下的功能。文章詳細描述了web.php和api.php的差異和使用情境,並簡要介紹了console.php和channels.php的功能。透過這篇文章,讀者可以更好地理解和利用Laravel的路由功能。
Laravel框架中的路由系統是其核心功能之一,它允許開發者輕鬆地定義應用程式的URL結構和相應的邏輯。本篇文章將深入探討Laravel路由的基本概念、進階功能以及實際應用。
在Laravel的MVC架構中,視圖(View)是呈現資料給使用者的關鍵部分。本篇深入探討了視圖的基本概念、建立與管理、與資料的互動方式,以及Blade模板引擎的應用。Blade提供了一套強大的工具,使動態視圖建立更為高效。
本篇深入探討了Model的基本定義、其Controller的關係,以及如何在Controller中使用Model進行CRUD操作。強調了Model的關聯方法,如hasMany,並透過範例程式碼展示了其實際應用。為初學者提供了一個清晰的Laravel入門路徑,同時也為有經驗的開發者提供了實用的參考。
追求乾淨的程式碼是好的開始,但不要陷入過度設計的陷阱,導致程式難以維護。實際上,考慮團隊狀況和專注於解決真正的問題更為重要。了解公司的規模和現實情況,適時調整工作重心。技術不斷進步,使得寫程式變得更加容易,但這並不意味著工程師的角色會消失。在選擇技術時,也要考慮隱形成本有時簡單的解決方案反而更有效。
每當看到相關的技術年會訊息,我總會想起大學時參加過的研討會,那種滿滿的熱情和期待。每次看到駭客年會的消息,都會讓我想起那段坐在會議廳中聽著台上講者所分享的技術。所以,我今天想來分享一下今年台灣的技術年會情報。
本篇文章為Laravel初學者提供了一個指南,深入探討了Laravel的routes目錄下的功能。文章詳細描述了web.php和api.php的差異和使用情境,並簡要介紹了console.php和channels.php的功能。透過這篇文章,讀者可以更好地理解和利用Laravel的路由功能。
Laravel框架中的路由系統是其核心功能之一,它允許開發者輕鬆地定義應用程式的URL結構和相應的邏輯。本篇文章將深入探討Laravel路由的基本概念、進階功能以及實際應用。
在Laravel的MVC架構中,視圖(View)是呈現資料給使用者的關鍵部分。本篇深入探討了視圖的基本概念、建立與管理、與資料的互動方式,以及Blade模板引擎的應用。Blade提供了一套強大的工具,使動態視圖建立更為高效。
本篇深入探討了Model的基本定義、其Controller的關係,以及如何在Controller中使用Model進行CRUD操作。強調了Model的關聯方法,如hasMany,並透過範例程式碼展示了其實際應用。為初學者提供了一個清晰的Laravel入門路徑,同時也為有經驗的開發者提供了實用的參考。
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
【在我葬禮上起舞】 2023年2月22 日,在法國西南部的Saint-Jean-de-Luz,一位女老師Agnès Lassalle被16歲的學生在課堂上刺殺身亡。 她的丈夫在告別式時放了爵士歌手Nat King Cole的《L-O-V-E》法文版,在妻子的棺木前,手搭著靈魂般,獨自翩然起
Thumbnail
而這次的「山海天人──我在自然裡」,一樣讓人驚豔! 不管是「靜觀山川」或「潛行海洋」展間,都十分用心地把自然的元素挪移到博物館中,其用意不是還原百分百的自然,而是塑造一個人與自然對話的管道,其沉靜和緩的白噪音,真的會讓人感到放鬆,有回歸自然的感覺
Thumbnail
咖啡是一個僅次於水之外,日常必要的飲品。不管身在何處,早上醒來一定要來杯咖啡,不然似乎缺乏些什麼似的,一整天都不太對勁。 倫敦散步的第一杯咖啡-Costa 在倫敦睜開眼的第一個早晨是由沐浴揭開序幕。由於前晚到達朋友家已是半夜,即使長程飛行後渴望盥洗,但因怕吵到朋友家人睡覺而改由一早起床後再洗澡。沒想
Thumbnail
疫情鎖國三年,最近終於公佈確認了開放邊境政策。許多朋友紛紛買好機票,我也常被問到何時要出發,不過我總覺得比起疫情前,我好像不太需要「出發」了。 出國有一種神奇的魔力。當出關,飛機離地那刻,所有煩心事彷彿就也一起被留在地面。飛機衝入雲層,你從雲海上空俯視地面,那些瑣事雖並未消失,卻也不再蹲踞在你肩上,
Thumbnail
無論後世如何給予評價,她以一介女流克服了種種困難,實踐她對於理想的台灣該是什麼樣子,至少她從未背棄這樣的信仰。 我想人間最難得的志業,就是在亂世中,找到自己的位置,找到推動國家的力量,找到一群願意犧牲奉獻的夥伴。 女人並沒有在時代噤聲,女人並沒有拒絕為他人的不幸抗爭,女人也並沒有止步於一種命運。
Thumbnail
2007年的某天下午,出差中的臭狗,遠從巴西打了一通電話回來。 「老婆!你知道我在做什麼嗎?」 「我在巴西的一條看不到盡頭的細沙灘上騎腳踏車!」 聽起來是在巴西的美麗沙灘旁有一片住宅區,然後他的同事擁有其中一戶,並不是平常居住的地方,而是需要開兩個小時車才會到的渡假屋,然後他們剛剛才在好大的面海陽台
Thumbnail
但對許多人來說,文學夢終究是一場不切實際的幻想。退而求其次,更多人追求的是更務實地,想要去掌握這種心醉於文字的能力。也許就是一場可及的「文字夢」吧。而編輯,就是這種務實地、可實踐地夢想。
Thumbnail
Peter Mayle這位廣告界前輩,不只棄業,還乾脆跑到普羅旺斯買一間兩百多歲年紀的老房子住了下來。他的舉動,成為我們這些想離職又不敢離職,想改變又害怕改變的人,一種精神上的出口。
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
【在我葬禮上起舞】 2023年2月22 日,在法國西南部的Saint-Jean-de-Luz,一位女老師Agnès Lassalle被16歲的學生在課堂上刺殺身亡。 她的丈夫在告別式時放了爵士歌手Nat King Cole的《L-O-V-E》法文版,在妻子的棺木前,手搭著靈魂般,獨自翩然起
Thumbnail
而這次的「山海天人──我在自然裡」,一樣讓人驚豔! 不管是「靜觀山川」或「潛行海洋」展間,都十分用心地把自然的元素挪移到博物館中,其用意不是還原百分百的自然,而是塑造一個人與自然對話的管道,其沉靜和緩的白噪音,真的會讓人感到放鬆,有回歸自然的感覺
Thumbnail
咖啡是一個僅次於水之外,日常必要的飲品。不管身在何處,早上醒來一定要來杯咖啡,不然似乎缺乏些什麼似的,一整天都不太對勁。 倫敦散步的第一杯咖啡-Costa 在倫敦睜開眼的第一個早晨是由沐浴揭開序幕。由於前晚到達朋友家已是半夜,即使長程飛行後渴望盥洗,但因怕吵到朋友家人睡覺而改由一早起床後再洗澡。沒想
Thumbnail
疫情鎖國三年,最近終於公佈確認了開放邊境政策。許多朋友紛紛買好機票,我也常被問到何時要出發,不過我總覺得比起疫情前,我好像不太需要「出發」了。 出國有一種神奇的魔力。當出關,飛機離地那刻,所有煩心事彷彿就也一起被留在地面。飛機衝入雲層,你從雲海上空俯視地面,那些瑣事雖並未消失,卻也不再蹲踞在你肩上,
Thumbnail
無論後世如何給予評價,她以一介女流克服了種種困難,實踐她對於理想的台灣該是什麼樣子,至少她從未背棄這樣的信仰。 我想人間最難得的志業,就是在亂世中,找到自己的位置,找到推動國家的力量,找到一群願意犧牲奉獻的夥伴。 女人並沒有在時代噤聲,女人並沒有拒絕為他人的不幸抗爭,女人也並沒有止步於一種命運。
Thumbnail
2007年的某天下午,出差中的臭狗,遠從巴西打了一通電話回來。 「老婆!你知道我在做什麼嗎?」 「我在巴西的一條看不到盡頭的細沙灘上騎腳踏車!」 聽起來是在巴西的美麗沙灘旁有一片住宅區,然後他的同事擁有其中一戶,並不是平常居住的地方,而是需要開兩個小時車才會到的渡假屋,然後他們剛剛才在好大的面海陽台
Thumbnail
但對許多人來說,文學夢終究是一場不切實際的幻想。退而求其次,更多人追求的是更務實地,想要去掌握這種心醉於文字的能力。也許就是一場可及的「文字夢」吧。而編輯,就是這種務實地、可實踐地夢想。
Thumbnail
Peter Mayle這位廣告界前輩,不只棄業,還乾脆跑到普羅旺斯買一間兩百多歲年紀的老房子住了下來。他的舉動,成為我們這些想離職又不敢離職,想改變又害怕改變的人,一種精神上的出口。