1.ci框架下的this->output->setheader 对header 值设置不成功还是改成php原生 header 方法
2.Access-Control-Allow-Methods 这个方法对* 通配符不起作用
3.在option请求中 当浏览器发出post请求为跨域请求时候会自动变为现实options请求,
当预检请求通过时候会发送
第二次请求,这时候是正常的post请求,
当预检请求失败的时候,这时候浏览器会发出Access-Control-Allow-Origin not allow 这种方式但还是200的正确返回
===============================================================
4.具体CORS跨域资源共享的实例
CORS分为两种请求:1.简单请求。2.复杂的预检请求
简单请求:请求方法在:HEAD,GET,POST三种方法
http头部信息:Accept,Accept_language Content_language,Last-Event-ID Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
凡是不同时满足上面两种情况的都是非简单请求
简单请求:
1.浏览器发送cors请求,服务端返回一个origin值添加在response中
(1)Access-Control-Allow-Origin 这个字段是必须添加的是请求的源头信息,要么是一个*,表示接受任意域名的请求。
(2)Access-Control-Allow-Credentials 表示是否允许发送Cookie
(3)Access-Control-Expose-Headers 该字段可选
CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发到服务器,一方面要服务器同意,指定Access-Control-Allow-Credentials字段。Access-Control-Allow-Credentials: true
非简单请求:
针对对服务器有特殊需求的比如:put或delete content-type:application/josn
非简单请求会在正式发送前发送一次预检请求:即options请求预检请求使用options来发送关键词orgin表示请求的原信息
options请求 是浏览器自动给服务器发送的原来请求是post浏览器在判断是否跨域时候自动发送的
options请求 是浏览器自动给服务器发送的原来请求是post浏览器在判断是否跨域时候自动发送的
options请求 是浏览器自动给服务器发送的原来请求是post浏览器在判断是否跨域时候自动发送的
发送:
options请求中会添加:Access-Control-Request-Method这个字段发送时候是必须的意思浏览器发送的请求方法是什么
回应:
字段以后,确认允许跨源请求,就可以做出回应。
Access-Control-Allow-Origin:*表示任意服务器资源可以访问(必选)
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 1728000
如果浏览器否定了预检信息:返回正常http信息
function checkCors()
{
$frontHosts = array();
$frontUrl = $_SERVER['APPLICATION_FRONT'];
$frontUrl = json_decode(base64_decode($frontUrl));
//$frontUrl=['http://localhost:8080','https://u5ba4db208645b-dev.oneitfarm.com'];
$origin = str_replace(['http://', 'https://'], '', $_SERVER['HTTP_ORIGIN']);
if (!empty($frontUrl)) {
foreach ($frontUrl as $item) {
$frontHosts[] = str_replace(['http://', 'https://'], '', $item);
}
}
if ($_SERVER["REQUEST_METHOD"] == "OPTIONS") {
if (in_array($origin, $frontHosts)) {
header("Access-Control-Allow-Origin:{$_SERVER['HTTP_ORIGIN']}");
header("Access-Control-Allow-Credentials:true");
header("Access-Control-Allow-Methods:POST,GET,PUT,DELETE,HEAD ");
header("Access-Control-Max-Age:1728000");
}
die();
} else {
if (in_array($origin, $frontHosts)) {
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header('Access-Control-Allow-Credentials:true');
header("Access-Control-Allow-Methods:POST,GET,PUT,DELETE,HEAD ");
}
}
}