如何知道请求是飞行前的,而不是实际的请求
How to know the request is preflight and not the actual request?
我使用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*/
}
相关文章:
- ajax请求的顺序总是不同的
- Meteor如何接收HTTP请求
- 有没有一种方法可以防止img get请求使用css或js发生
- 从ajax请求中获取javascript对象
- JSONP请求返回结果,但也触发error_callback
- 在localhost Dev Box上测试JSONP请求的最佳方式
- Ajax请求文档就绪会导致jquery加载缓慢
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- 在openshift node js应用程序中获取请求
- 反应路由器弄乱了请求网址
- 在我的情况下,如何进行http请求
- 使用密码对话框Javascript请求帮助
- servlet中的请求对象,而不是从jsp接收参数值
- 否'访问控制允许来源'标头存在于IISNOde中请求的资源(AngularJS+NodeJs)上
- JavaScript代码未正确检查ajax请求
- XMLHttpRequest无法加载飞行前的url响应具有无效的HTTP状态代码404
- 对api的Angularjs$http.post()调用在飞行前OPTIONS调用中引发405错误
- 发送飞行前(OPTIONS)AJAX请求和crendentials
- 如何知道请求是飞行前的,而不是实际的请求