ajax出现Request Method: OPTIONS问题的原因及解决

标签:         

问题出现

在使用uniapp做小程序项目时接口请求总是出错,打开调试发现接口请求了两次,一次是OPTIONS一次是GET。OPTIONS无返回值,GET有返回值。之前对OPTIONS有所了解,但具体导致的问题没出现过

问题原因

其实跨域分为 简单跨域请求和复杂跨域请求:
简单跨域请求是不会发送options请求的
复杂跨域请求会发送一个预检请求options
复杂跨域请求要满足以下:
1、请求方法不是GET/HEAD/POST
2、POST请求的Content-Type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain
3、请求设置了自定义的header字段

我的接口请求中设置了自定义的header字段,且我的接口携带的参数逻辑是不允许两次请求的(后端每次接收到请求后,请求参数即失效,所以必须避免触发预检请求)

解决方法

1.可去除自定义header字段来解决

2.后端程序处理预检请求(如PHP语言中,判断如果是OPTIONS请求则允许各种请求头,然后直接返回)

//处理跨域Options预检请求
if($_SERVER['REQUEST_METHOD'] == 'OPTIONS'){
    //允许的源域名
    header("Access-Control-Allow-Origin: *");
    //允许的请求头信息
    header("Access-Control-Allow-Headers: header1,header2");
    //允许的请求类型
    header('Access-Control-Allow-Methods: GET, POST, PUT,DELETE,OPTIONS,PATCH');
    return;
}

注意:(后端设置Access-Control-Allow-Headers: *后,实际测试时发现华为手机自带浏览器OPTIONS还是失败,经了解部分浏览器不支持*,需要写明允许的header)

Chome浏览器对于服务端返回的 Access-Control-Allow-Headers: * 不区分
如果是IE、火狐,360极速兼容模式, 则后台必须修改为 Access-Control-Allow-Headers: 自定义header1,自定义header2

php后端处理OPTIONS


发表评论 登录

目前评论:0