跨域问题

CORS 解决跨域的一般用法

2019-02-13  本文已影响0人  forever_youyou

详情参见: MDN HTTP访问控制 (CORS)

常用设置(一般情况够用了)

XMLHttpRequest 或 Fetch 发起的跨域 HTTP 请求

后端响应头设置:

如果需要附带身份凭证(携带cookie)则需要如下额外配置:

代码动态控制允许多个域(以php为例)

// 允许跨域的origin白名单, 为空则允许所有origin跨域
$allowOrigin = []; // 如: ['http://localhost:8080', 'https://host:8081']
// 跨域访问的时候才会存在该字段
$origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
// 有配置白名单且当前origin在白名单
if (!empty($allowOrigin) && in_array($origin, $allowOrigin)) {
    header("Access-Control-Allow-Origin: {$origin}");
}

注:
IE 10 提供了对规范的完整支持,但在较早版本(8 和 9)中,CORS 机制是借由 XDomainRequest 对象完成的。


扩展阅读(摘自MDN)

什么情况下需要 CORS ?

跨域资源共享标准( cross-origin sharing standard )允许在下列场景中使用跨域 HTTP 请求:

简单请求

某些请求不会触发 CORS 预检请求。本文称这样的请求为“简单请求”,请注意,该术语并不属于 Fetch (其中定义了 CORS)规范。若请求满足所有下述条件,则该请求可视为“简单请求”:

预检请求

即好多同学初次接触感到奇怪的 OPTIONS 请求

与前述简单请求不同, “需预检的请求”要求必须首先使用 OPTIONS 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。"预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。

当请求满足下述任一条件时,即应首先发送预检请求:

上一篇 下一篇

猜你喜欢

热点阅读