谁能够排除同源策略?

3

Code. Why

$.ajax({
    type : "get",
    url : "http://www.facebook.com",        
    success: function(data){
           console.log(data);
     }
});

工作和

$.ajax({
    type : "get",
    url : "http://www.google.com",        
    success: function(data){
           console.log(data);
     }
});

在浏览器控制台中抛出著名的XMLHttpRequest cannot load同源策略异常!

为什么?我猜这取决于浏览器?


1
http://enable-cors.org/ - Joe Frambach
你的小提琴不起作用 - 它只是没有产生错误。 - apsillers
请求 Facebook 的请求未能到达成功回调并且没有得到响应。该请求似乎在到达同源错误之前被取消了。 - Kevin B
2个回答

8

http://www.facebook.com 发送了一个 301 Moved Permanently 的响应,将重定向到 https://www.facebook.com

看起来重定向会比跨域请求失败更加安静。但是,两个请求都会失败。

编辑

根据W3C Ajax规范

如果响应的HTTP状态码为301、302、303、307或308

  1. 将请求URL设置为Location标头传达的URL。
  2. 如果源站和请求URL的来源相同,则透明地遵循重定向,同时遵守同源请求事件规则。
  3. 否则,请遵循跨域请求步骤并终止此算法的步骤。

“透明地遵循重定向”这句话意味着Ajax应该将301重定向的目标视为原始目标。但是,在执行重定向时,同源策略会针对新的目标源重新检查。

目标域名还必须与请求脚本具有相同的来源,或者必须响应CORS头以允许请求来源访问。


jQuery在ajax调用中不会遵循任何重定向(至少在我上次检查时是这样)。可能是由于跨域策略,只有当最终的URL不允许访问时,才会违反CORS(跨域资源共享)规则。(但我需要检查规范,以确保这一点) - t.niese
你能更具体地说明“更安静地失败”吗? - markzzz
@t.niese Ajax重定向是完全有效的;请参见我编辑的W3C规范引用。 - apsillers

1
服务器(Facebook、Google等)是否允许跨域加载其内容取决于其自身。这被称为跨源资源共享(CORS)。要在您的服务器上启用CORS,请在响应中提供以下标头:Access-Control-Allow-Origin: *。您无法更改您不拥有的服务器的行为。

好的,但允许所有域作为来源(“*”)是一个坏主意,这完全禁用了SOP。 - Tali
你为什么认为这是一个明显的坏主意?在使用Bearer令牌进行API调用的情况下,这是一个合理的设置。即使对于支持基于cookie的身份验证的应用程序,仅仅拥有这个设置对我来说似乎也不是一个坏主意。你有什么场景想法吗?@Tali - racec0ndition

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接