我使用CORS将数据发送到我的服务器,这是在另一个域中。
浏览器发送第一个请求来检查服务器(preflight),然后发送主请求。我想知道什么时候请求是"预飞行",所以我可以更快地返回头。
我想要这样的东西:
if (isPreflight) {
header('Access-Control-Allow-Origin: *');
exit;
} else {
// handle the main request
}
从技术上讲,飞行前请求不仅仅是具有方法OPTIONS
的请求。三个头需要存在,Access-Control-Request-Method
, Access-Control-Request-Headers
和Origin
头。
来源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*/
}