JavaScript 同源策略 - 它如何应用于不同的子域?

Posted

技术标签:

【中文标题】JavaScript 同源策略 - 它如何应用于不同的子域?【英文标题】:JavaScript Same Origin Policy - How does it apply to different subdomains? 【发布时间】:2011-02-02 09:08:26 【问题描述】:

同源策略如何应用于以下两个域?

http://server1.MyDomain.com

http://server2.MyDomain.com

如果内容是从 server2 检索的,我可以在 server1 上托管的页面上运行 JS 吗?

edit 根据 Daniel 下面的回答,我可以使用 <script> 标签在不同子域之间包含脚本,但是异步请求呢?如果我从 server2 下载脚本到 server1 上托管的页面会怎样。我可以使用脚本与 server2 上的服务进行异步通信吗?

【问题讨论】:

里程会因 IE 而有所不同,但一般规则是相同的主机,相同的端口用于直接 XHR。您可以从您选择的任何地方加载脚本,但就异步而言,JSONP 脚本注入是您唯一没有代理的选择。 【参考方案1】:

您只能使用<script> 标签在不同子域之间包含脚本,因为它不受政策约束。

使用http://www.example.com/dir/page.html 作为源(来自Wikipedia):

Compared URL                               Outcome  Reason
---------------------------------------------------------------------------------------------
http://www.example.com/dir/page.html       Success  Same protocol and host
http://www.example.com/dir2/other.html     Success  Same protocol and host
http://www.example.com:81/dir2/other.html  Failure  Same protocol and host but different port
https://www.example.com/dir2/other.html    Failure  Different protocol
http://en.example.com/dir2/other.html      Failure  Different host
http://example.com/dir2/other.html         Failure  Different host (exact match required)
http://v2.www.example.com/dir2/other.html  Failure  Different host (exact match required)

更新:

我可以使用脚本进行交流吗 与服务异步 服务器2?

是的,您可以使用JSONP,它利用<script> 标签的开放政策从其他来源检索JSON。

您可能还想考虑使用反向代理,如以下 Stack Overflow 帖子所述:

What am I missing in the XMLHttpRequest?

【讨论】:

@Daniel,感谢您的回复。我已经用后续问题编辑了这个问题。你有机会把你的想法加进去吗?谢谢 @Dave:您可能想查看 JSONP。您可能还需要考虑设置反向代理,如下所述:***.com/questions/2482916/… 这是一个很好的、彻底的答案。【参考方案2】:

当然,您可以运行您插入的任何脚本,不管它来自哪里。想想如何在您的页面上插入谷歌地图。

您描述的是一种称为 jsonp 的模式。其他主机上的服务器返回您在页面中插入的脚本,并且该脚本使用响应参数调用页面中的函数。

【讨论】:

以上是关于JavaScript 同源策略 - 它如何应用于不同的子域?的主要内容,如果未能解决你的问题,请参考以下文章

当浏览器存在同源策略时,REST API 如何与 JavaScript 一起使用?

同源策略形象解读

同源策略

javascript和同源策略混淆

javascript中的同源策略在哪里实施? [关闭]

显示 Javascript“同源策略”违规