引言
在 Web 開發中,HTTP 請求是不可或缺的一部分。尤其當涉及到跨域(Cross-Origin)問題時,了解一般請求(Simple Requests)與預檢請求(Preflight Requests)是非常重要的。本文將對這兩種類型的請求進行詳細的介紹。
一般請求(Simple Requests)
一般請求是最常見的 HTTP 請求,包括像 GET、POST 和 HEAD 這樣的 HTTP 方法。一般請求不會觸發 CORS 預檢請求。
特點:
- 只能使用瀏覽器批准的安全 headers。
- 不能有任何自定義 headers(例如,Authorization)。
- 只能用于 GET、POST 和 HEAD 方法。
- 預檢請求(Preflight Requests)
- 預檢請求是一種特殊的 HTTP 請求,通常用於驗證跨域的 HTTP 請求是否安全。在實際的跨域請求被發送之前,瀏覽器會先發送一個 OPTIONS 方法的 HTTP 請求。
預檢請求特點:
-
使用 OPTIONS 方法。
-
包含一些特定的 CORS 相關 headers,如 Access-Control-Request-Method(表示實際請求將使用哪種 HTTP 方法)。
-
無需任何實際的數據內容。
預檢請求的運作方式
-
發起預檢請求:當瀏覽器檢測到一個跨域請求可能需要預檢時(例如使用了 DELETE 方法或包含自定義 headers),它會先發送一個 OPTIONS 請求到目標伺服器。
-
伺服器響應:伺服器收到 OPTIONS 請求後,會返回一組 CORS 相關的 headers,例如 Access-Control-Allow-Origin、Access-Control-Allow-Methods 和 Access-Control-Allow-Headers。
-
瀏覽器驗證:瀏覽器會根據返回的 CORS headers 來決定是否允許實際的跨域請求。如果允許,瀏覽器會繼續發送實際的請求;否則,它會阻止請求並在控制台中顯示錯誤。
-
實際請求:如果預檢請求成功,瀏覽器會自動發送實際的跨域請求。
為什麼需要預檢請求?
預檢請求的主要目的是為了安全。它讓伺服器有機會審查即將到來的跨域請求,並確定是否允許該請求。這可以防止不安全或者未經授權的請求訪問敏感數據。
如何處理預檢請求?
伺服器應回應預檢請求並提供適當的 CORS headers,以告知瀏覽器是否允許實際的跨域請求。
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
return;
}
總結
了解一般請求與預檢請求是建構安全、高效的 Web 應用與 API 的關鍵。透過這些機制,開發者不僅可以確保應用程式的安全性,還可以提供更加順暢的用戶體驗。進一步了解預檢請求的運作方式對於優化跨域請求的處理尤為重要。