在我的应用程序中,我在一个子域(dev.u413.com)上有一个网站,并且我使用jQuery向另一个子域(api.u413.com)的JSON api提出了ajax请求。当我在Chrome开发工具和Firefox Firebug中检查请求时,似乎阻止了我的请求Access-Control- Allowed-Origin。我设置document.domain为当前域的后缀:document.domain = 'u413.com';。
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); } });
如果我将ajax请求修改为在同一域中,则请求成功。
$.ajax({ dataType: 'json', crossDomain: false, data: { parseAsHtml: true, cli: 'help' }, url: 'http://dev.u413.com/', success: function (response) { alert(response.Command); } });
为什么会这样?浏览器不应该抱怨跨域问题,因为我document.domain根据相同来源策略的指南设置了两个子域的通用后缀。
我的应用当前正在使用jsonp,但是我觉得正确的ajax请求应该按照我上面链接的相同原始策略工作。如果不需要,我宁愿不使用jsonp。是否无法跨子域发出常规的ajax请求?
document.domain不适用于AJAX。它旨在用于跨域iframe和窗口通信。在您的情况下,您违反了相同的原始策略(表的最后一行),因此您需要使用JSONP或服务器端网桥。
这是一个很好的指南,它说明了用于实现跨域AJAX请求的不同技术。