有一个网站,包含很多子域名,包含很多其他网站的url
什么样的url算外域,什么样的算内域
比如https://www.google.com.hk,https://www.google.com 算内域还是外域,mail.google.com呢
所谓的跨域请求,怎么算跨域
有一个网站,包含很多子域名,包含很多其他网站的url
什么样的url算外域,什么样的算内域
比如https://www.google.com.hk,https://www.google.com 算内域还是外域,mail.google.com呢
所谓的跨域请求,怎么算跨域
*.google.com.hk
算是一个域,前面的 * 换成任何组合都算是一个域内的,不同的 * 算是不同的子域。
a.b.google.com.hk
和
a.b.c.google.com.hk
都算是同一域下的子域。
google.com 和 google.com.hk 算是不同的域。因为两者的域名不同。域名包括一个字符串(例如 google、facebook 等)和一个域名后缀,域名后缀需要在 NSI 注册。只有域名(狭义上的,类似google facebook 这样的一个字符串)和域名后缀都一样才能认为在同一个域。
跨域请求是指从一个域发起请求,请求的 url 在另外一个域中。跨域通常会造成安全问题,所以受限制。这个跟 http 协议中的 cookie 设置有关,cookie 是按照域名存放在浏览器本地的一些数据文件,为了保证安全和保护隐私,cookie 被设置为不能跨域读取。例如,在 baidu.com 下的服务器端无法读取存放在浏览器端的 google.com 域存放的 cookie 。
从 a.google.com 发起请求 b.c.google.com 不算是跨域,因为他们是同属 google.com 域下的不同子域。只要在设置 cookie 时域设为 google.com 就不存在跨域问题。但是如果从 a.google.com 请求 google.com.hk 就属于跨域了,因为域名不同。
在解答这个问题之前,首先简单说一下什么叫做域名。
又称网域、网域名称,是由一串用点分隔的名字组成的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...