由于浏览器的同源保护需要,第一次请求( 请求类型options)到服务器去验证 到不到响应就无法通过验证
所以需要对客户做一个正常响应(意思就是输出给浏览器,就是空内容)
第二次才是真正的请求
列子:
$origin = $_SERVER['HTTP_ORIGIN'] ?? ''; $allowOrigin = Conf::get('app.cross_domain'); if (!empty($origin) && !empty($allowOrigin)) { if (in_array($origin, $allowOrigin)) { $origin = $allowOrigin == "*" ? $allowOrigin : $origin; header('Access-Control-Allow-Origin: ' . $origin); header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS'); header("Access-Control-Allow-Credentials: true");//支持cookie跨域 header("Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With"); header('Access-Control-Max-Age: 1800'); //判断是否是Options请求 if ($request->isOptions()) { return http_response_code(200); } } }
一般 设置这个'Access-Control-Max-Age: 1800') 就能控制预检请求缓存在规定时间后才再次发起preflight预检请求(options) 1800表示隔30分钟才发起预检请求
标签:Control,origin,allowOrigin,跨域,预检,Access,preflight,请求 From: https://www.cnblogs.com/yangshiyi/p/16901953.html