如何知道请求是飞行前的,而不是实际的请求

How to know the request is preflight and not the actual request?

本文关键字:请求 飞行前 何知道      更新时间:2023-09-26

我使用CORS将数据发送到我的服务器,这是在另一个域中。

浏览器发送第一个请求来检查服务器(preflight),然后发送主请求。我想知道什么时候请求是"预飞行",所以我可以更快地返回头。

我想要这样的东西:

if (isPreflight) {
   header('Access-Control-Allow-Origin: *');
   exit;
} else {
   // handle the main request
}

从技术上讲,飞行前请求不仅仅是具有方法OPTIONS的请求。三个头需要存在,Access-Control-Request-Method, Access-Control-Request-HeadersOrigin头。

CORS预飞行请求是一个CORS请求,它检查是否有CORS协议被理解,服务器使用特定的方法和头文件。

这是一个OPTIONS请求,使用三个HTTP请求头:Access-Control-Request-Method, Access-Control-Request-Headers以及头起源。

来源

我在PHP中有一个方法来识别preflights。

function isPreflight() {
    $method = $_SERVER['REQUEST_METHOD'];
    $headers = array_filter($_SERVER, function($item) {
        return preg_match('/^HTTP_/', $item);
    }, ARRAY_FILTER_USE_KEY);
    if (!($method == 'OPTIONS' && isset(
        $headers['HTTP_ACCESS_CONTROL_REQUEST_METHOD'],
        $headers['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'],
        $headers['HTTP_ORIGIN'])))
        return false;
    return true;
}

使用Adriano_Pinaffo的答案

这个答案缺少与飞行前请求一起发送的报头。


找到一个方法来做这个

只需将CORS标头放在"处理数据方法"之前。如果请求方法是OPTIONS(这是默认的preflight方法),则退出脚本,如果它是可接受的方法之一(GET, POST或其他任何方法),则处理数据。

header('Access-Control-Allow-Origin: *');
if ($_SERVER['REQUEST_METHOD'] == "OPTIONS") {
    exit;
} else {
    /*handle data*/
}