跨域这个东西,额……抱歉,跨域不是个东西。大家一定都接触过,甚至解决过因跨域引起的访问问题,无非就是本地代理,服务器开白名单。但是,但是!你真的知道跨域背后的原理么?嗯……不就是同源策略么?我知道啊。但是你知道为什么要有同源策略么?同源策略限制了哪些内容?又有哪些内容不受同源策略的限制呢?那么,这篇文章,带你搞透、搞懂跨域。

  其实很多东西本质上来说,没有难与不难的标签,只不过,看你是否愿意花心思,时间,精力去总结整理。嗯……我知道你或许没时间,想休息,那么我来帮你。

  花点时间,看完这篇史上最完整的关于跨域的讲解。超过了一万字,而且你要跟着写代码的话,会花更多的时间,除非你做好准备了,否则,随你吧~

第一部分 理论

  这一部分,我们先来看理论,不涉及任何代码。主要是讲清楚什么是跨域,同源策略的定义和产生的原因,以及什么是站点,站点与域又有啥区别?当我们理解了基本的概念之后,我会带大家梳理浏览器允许HTML加载、引用哪些资源,以及哪些资源会导致跨域,哪些不会。

  开始吧~又要开始长篇~大论了。

一、URL到底是什么?

  嗯?你不是要讲跨域么?你说URL干啥?嗯……因为后面的理解离不开URL。所以我们花点时间,先来理解下前置知识。

  URL,统一资源定位符,Uniform Resource Locator,它是URI的一种子分类,在URI的下面还有一种更罕见的资源使用方式,叫做URN。OK,我们单纯的聊URL又牵扯出来了额外的知识概念,我们一起梳理下。

  URI(Uniform Resource Identifier),叫做统一资源标志符,在电脑术语中是用于标志某一互联网资源名称的字符串。该种标志允许用户对网络中(一般指万维网)的资源通过特定的协议进行交互操作。URI的最常见的形式是统一资源定位符(URL),经常指定为非正式的网址。更罕见的用法是统一资源名称(URN),其目的是通过提供一种途径,用在特定的名字空间资源的标志,以补充网址。

  URN我们很少使用,最常用的一种URI的形式就是URL,所以我们着重分析下什么是URL。通常URI的格式如下:

  举个例子:

                    hierarchical part
        ┌───────────────────┴─────────────────────┐
                    authority               path
        ┌───────────────┴───────────────┐┌───┴────┐
  abc://username:[email protected]:123/path/data?key=value&key2=value2#fragid1
  └┬┘   └───────┬───────┘ └────┬────┘ └┬┘           └─────────┬─────────┘ └──┬──┘
scheme  user information     host     port                  query         fragment

  urn:example:mammal:monotreme:echidna
  └┬┘ └──────────────┬───────────────┘
scheme              path
10-03 13:16