跨子域ajax请求被拒绝,即使文档.正确设置域

Cross-subdomain ajax request denied even when document.domain is set correctly

本文关键字:文档 设置 拒绝 ajax 请求      更新时间:2023-09-26

在我的应用程序中,我有一个网站在一个子域(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');