在解答这个问题之前,首先简单说一下什么叫做域名。
又称网域、网域名称,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)[1]。internet的核心服务DNS(Domain Name System,网域名称系统,有时也简称为域名)提供域名到IP地址的相映射。以方便用户不用去记机器能识别的IP地址。
接下说说域名的划分。
我们所熟悉的com,gov,edu,cn,hk,us,tw等等这些是顶级域名,一般用来分配给特殊机构或者某个国家用于标识。具体信息请参考文献[1]。在顶级域名下,每个Web网站会到各自国家的域名服务提供商那里去申请域名,申请到的域名就是二级域名,例如:google.com,baidu.com,segmentfault.com等等。在二级域名下,一些大的Web网站一般会根据不同的业务或者功能等,使用不同的子域名即三级域名,例如code.google.com,mail.google.com等等。依此类推,再往下就是三级域名,例如:xxx.xxx.xxx.xxx。一般使用的比较少。说到这,我想你已经可以分辨域名等级了。对于一个url,去掉协议头(例如http://,https://),相对路径(例如/xxx.htm,/xxx/xxx.htm?a=xxx),剩下的部分,看有几个'.',有n个,就是n级域名,没有就是顶级域名。
说了一大堆,进入正题。
內域、外域、跨域都是有一个参照物的概念,必须以某个URL为基准,其他的URL对于其而言是属于內域还是外域。对于同一级域名下的所有URL,都属于一个域。
如以mail.google.com/abc/xxx.htm为基准。
內域:mail.google.com/def/xxx.htm与其属于同一个域,故可以认为是內域。
外域:google.com/abc/xxx.htm与其的域名级别不同,不属于同一个域故可认为是外域。
跨域:跨域更多是用来标识某个跳转的动作。如从一个域下面(mail.google.com/abc/xxx.htm)跳转到另一个域下面(google.com/abc/xxx.htm),就可以认为是跨域。所以外域标识的两个URL之间的跳转,就是跨域跳转。
由于浏览器在访问Web网站的时候会与Web服务器建立Seesion(这个做Web开发的应该很清楚了吧,如不太清楚请自行google之),session在浏览器端的保存是通过一个seesionid来维护,而seesionid的作用域是与域名绑定的,不同域名的session是不同的。所以导致了不同域名下的Web站点需要共享某些信息(例如用户的登录信息等)时,就有跨域的问题。通常这是跨域导致的主要问题之一,比较好的解决方案就是SSO。对于跨域还有很多前端的问题:例如JS不能跨域调用等等,由于本人对前端不是十分了解,就不做表述了。下面是几个简单的跨域例子:
1、一级域名不同:google.com与baidu.com
2、一级域名相同,二级域名不同:mail.google.com与code.google.com
3、依此类推,n级域名相同,n+1级域名不同...
除了这些之外,一般有些人所说的跨域往往还包括:
4、域名相同,端口不同:xxx.com:80与xxx.com:8080
5、域名相同,协议不同:http://xxx.com与https://xxx.com
6、IP与域名的混合:http://127.0.0.1/和 http://localhost/
其实严格意义上来讲,个人觉得下面3中不应该归类到跨域范畴。
(ps: 答案可能有不完整和错误,欢迎指正^_^)
参考文献:
[1] http://zh.wikipedia.org/wiki/%E5%9F%9...