在我的应用程序中,我有一个网站在一个子域(dev.u413.com),我使用jQuery使ajax请求JSON api在另一个子域(api.u413.com)。当我检查请求在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);
}
});
如果我将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请求的不同技术。
同源策略是我必须处理的最令人沮丧的浏览器相关主题之一。对我来说愚蠢的是,同一域的2台服务器不能通信。不幸的是,同源策略认为,即使是在不同端口上向同一服务器发出的2个请求也违反了同源策略。我认为这将在未来的浏览器中变得更好:
http://www.html5rocks.com/en/tutorials/file/xhr2/查找:Cross Origin Resource Sharing (CORS)
基本上,你的服务器只需要设置一个响应头,说"是的,允许跨域或跨子域调用服务器xyz"。
我确信所有的浏览器都支持这个功能还需要一段时间(而且我必须支持ie8,直到我们的大多数用户都放弃它)——但至少隧道尽头有光。您还需要将document.domain = 'u413.com
添加到您的其他子域名
是不可能使常规ajax请求跨子域?
这在技术上不是AJAX,但是您可以模仿AJAX请求,成功地跨域提交表单。缺点是你不能访问响应,这将导致页面被重定向到表单的ACTION
URL。
而不是:
jQuery.post('https://www.com',
'offerCode':523153,
'accountNumber':'',
'_item.x':'42',
'_item.y':'21'
});
使用:
jQuery('<form action="https://www.com" method="POST">
<input type="text" name="offerCode" value="523153">
<input type="text" name="accountNumber" value="">
<input type="text" name="_item.x" value="42">
<input type="text" name="_item.y" value="21">
</form>').trigger('submit');