引言

在 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 的關鍵。透過這些機制,開發者不僅可以確保應用程式的安全性,還可以提供更加順暢的用戶體驗。進一步了解預檢請求的運作方式對於優化跨域請求的處理尤為重要。

最後修改日期: 2023 年 9 月 6 日

作者