CORS跨域资源共享的实例心得

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 ");
            }

        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值