# 跨域

  • 浏览器为了安全,有个策略: 同源策略, 页面中的链接必须域名一致。

# 为什么跨域

  • 页面请求的接口可能位于独立api服务器, 所以就会有跨域存在。

# 解决问题

  1. 代理,没怎么研究
  2. jsonp,构造javascrit 标签,利用src属性请求这个链接,返回body是可执行的js代码,代码中的函数需要本地定义,巧妙的接收到了数据
  3. 配置api服务器支持跨域资源共享, nginx location中添加 "add_header Access-Control-Allow-Origin *" ,* 表示任意域名过来的都可以请求, 也可以是某个域名 "http://127.0.0.1:5000"
  4. preflight request(预检请求 OPTIONS方法)
  • W3C规定的,有些类型的请求比如post,都需要优先发送一个OPTIONS方法的请求,以获得nginx是否支持这种类型,比如post一个json格式的数据,就需要先发options请求
  • 发送options请求,是为了获取nginx是否支持content-type ,所以nginx配置需要增加:
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
1
  • 这样请求header中有Access-Control-Allow-Headers: content-type,

  • 服务器响应header返回的也有Access-Control-Allow-Headers: content-type,就不会报Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.的错误了。

  • 以下几种post格式不用发options请求,直接发post请求

application/x-www-form-urlencoded
multipart/form-data
text/plain
1
2
3
  1. vue的axios.post 方法MIME类型默认content-type发送json格式的,所有就会产生options请求,导致失败。