即使正确设置了document.domain,跨子域ajax请求也被拒绝

Che*_*hev 16 javascript jquery json jsonp cross-domain

在我的应用程序中,我在一个子域(dev.u413.com)上有一个网站,我使用jQuery向另一个子域(api.u413.com)上的JSON api发出ajax请求.当我检查Chrome开发工具和Firefox Firebug中的请求时,我的请求似乎被阻止了Access-Control-Allowed-Origin.我设置document.domain为当前域的后缀:document.domain = 'u413.com';.

这是我的要求:

    $.ajax({
        dataType: 'json',
        data: { parseAsHtml: true, cli: 'help' },
        url: 'http://api.u413.com/',
        success: function (response) {
            alert(response.Command);
        }
    });
Run Code Online (Sandbox Code Playgroud)

如果我将ajax请求修改为在同一个域上,则请求成功.

    $.ajax({
        dataType: 'json',
        crossDomain: false,
        data: { parseAsHtml: true, cli: 'help' },
        url: 'http://dev.u413.com/',
        success: function (response) {
            alert(response.Command);
        }
    });
Run Code Online (Sandbox Code Playgroud)

为什么会这样?浏览器不应该抱怨跨域问题,因为我document.domain根据相同原始策略的指南设置了两个子域的公共后缀.

我目前正在使用jsonp的应用程序,但我觉得正确的ajax请求应该按照我上面链接的相同原始策略工作.如果我不需要,我宁愿不使用jsonp.是否无法跨子域定期发出ajax请求?

Dar*_*rov 20

document.domain不适用于AJAX.它适用于跨域iframe和窗口通信.在您的情况下,您违反了相同的原始策略(表的最后一行),因此您需要使用JSONP或服务器端桥.

这是一个非常好的指南,它说明了实现跨域AJAX请求的不同技术.


小智 5

相同的原始政策是我必须处理的最令人沮丧的浏览器相关主题之一.傻到我,同一个域上的2台服务器无法通信.不幸的是,相同的原始策略甚至考虑对同一服务器的2个请求,但是在不同的端口上违反了相同的源策略.我认为未来的浏览器会变得更好:

http://www.html5rocks.com/en/tutorials/file/xhr2/

搜索:跨源资源共享(CORS)

基本上你的服务器只需设置一个响应标题说"是的,允许跨域或交叉子域调用服务器xyz是可以的".

在所有浏览器支持这一点之前还需要一段时间我肯定(并且我必须支持ie8,直到我们的大多数用户仍然关闭它) - 但至少在隧道尽头有光.