header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Origin: https://test.com');
在实际项目中最好指定能跨域访问的域名,增长安全性。能够写在一个公共类里面,封装一个方法调用。
// 设置能访问的域名 static public $originarr = [ 'https://test1.com', 'https://test2.com', ]; /** * 公共方法调用 */ static public function setheader() { // 获取当前跨域域名 $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : ''; if (in_array($origin, self::$originarr)) { // 容许 $originarr 数组内的 域名跨域访问 header('Access-Control-Allow-Origin:' . $origin); // 响应类型 header('Access-Control-Allow-Methods:POST,GET'); // 带 cookie 的跨域访问 header('Access-Control-Allow-Credentials: true'); // 响应头设置 header('Access-Control-Allow-Headers:x-requested-with,Content-Type,X-CSRF-Token'); } }
起初只在文件开头设置了php
header('Access-Control-Allow-Origin:*');
而后报错html
Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers in preflight response.
解决方法:跨域
文件开头设置数组
header('Access-Control-Allow-Origin:*'); header('Access-Control-Allow-Methods:OPTIONS, GET, POST'); // 容许option,get,post请求 header('Access-Control-Allow-Headers:x-requested-with'); // 容许x-requested-with请求头
后成功浏览器
其中比较疑惑的是 Access-Control-Allow-Headers 的设置。 看了 这篇文档 后理解了安全
若是浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的。它也是一个逗号分隔的字符串,代表服务器支持的全部头信息字段,不限于浏览器在"预检"中请求的字段。服务器
而后看了请求头中确实 包括Access-Control-Request-Headerscookie
而后成功返回接口信息cors