1

我正在开发一个backbone.js 项目,我正在调用我的github repo。我有我的集合和模型引导加载,所以一旦我的页面被构建它们就存在,但是当我调用 model.fetch() 我得到这个消息:(用用户名替换:username)

XMLHttpRequest cannot load https://api.github.com/users/:username.
Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin.

我已经阅读了一些消息post1post2,他们提到了修改主干同步功能,但我不完全确定如何。到目前为止,这是我的代码(在我的 Backbone.Router 中):

userDetails: function(id) {
    console.log('Loading: userDetails');
    var User = Users.get(id);
    User.fetch({dataType: "jsonp"});
    console.log(User);
    userView = new UserView({
        model: User
    });
    userView.render();
},

谢谢!

4

2 回答 2

4

CORS 在后端启用。jQuery 基础知道它何时发出跨域请求并相应地修改它。问题是服务器,在这种情况下,api.github.com不允许 CORS 请求。

服务器必须响应(至少):

Access-Control-Allow-Origin: * (or the host in which your page is being served)

由于您可能没有 github,因此您必须编写服务器端代理或查看 github 是否可以为您提供 JSONP 调用(jQuery 也很乐意为您提供)。

MDN 访问控制文档


编辑

话虽如此,如果您需要修改 jQuery 通过主干发出的请求,则无需重写该sync方法。使用jQuery 的$.ajaxSetup方法添加任何额外的标头、设置类型等。只要确保$.ajaxSetup在与.save().fetch().destroy()$.ajaxSetup

于 2012-04-05T21:02:37.640 回答
0

我最近遇到了类似的问题,最终使用了mod_proxy。请参考:http ://blog.lakmali.com/2010/11/apache-proxy-configuration-and-load.html 这篇博文非常清晰且易于理解。

mod_proxy也支持“https”,不过我自己还没试过!请 google 更多内容以了解代理选项,例如 mod_proxy、mod_jk 等。

By going with mod_proxy, we no longer have to make any Cross-Domain calls. Hence, there was no need to worry about IE8/IE9's XDomainRequest hack for performing Cross-Domain requests. [Note: Before using *mod_proxy*, We were trying to over-ride the Backbone.sync to make explicit calls to XDomainRequest instead of jQuery's ajax in order to take care of CORS issues on IE9!]

于 2012-04-06T03:47:30.807 回答