我正在构建一个Backbone.js应用程序来与我建立的api交谈。
api坐在上面 api.foo.com 网站上 web.foo.com
我设法让CORS使用apache中适当的头字段
Header set Access-Control-Allow-Origin "http://web.foo.com"
Header set Access-Control-Allow-Methods "GET,PUT,POST,DELETE,OPTIONS"
Header set Access-Control-Allow-Headers Content-Type
Header set Access-Control-Allow-Credentials "true"
Header append Access-Control-Allow-Headers Origin
Header append Access-Control-Allow-Headers Accept
Header append Access-Control-Allow-Headers X-Requested-With
并将xhrFields设置为
f = { withCredentials: true}
params.xhrFields = f;
// Make the request, allowing the user to override any Ajax options.
$.ajax(params);
这一切都适用于chrome。我即将发布api.foo.com/sessions登录信息,获取一个cookie,然后使用该cookie向api.foo.com发送另一个请求。
不幸的是,当我切换到Firefox 10.0.7时,这没有用。 withCredentials似乎没有得到jquery来获取cookie并使用它。
与大多数与stackoverflow相关的问题不同,这不是一次性的,我需要让它在浏览器中保持一致(我还没有进入IE)。
我正在使用
Backbone.js 0.9.1 jquery 1.7.1 要求1.0.7 下划线1.3.1
适用于
Chrome 17.0.963.65
无法在firefox 10.0.2上运行
有人能帮助我吗?
答案 0 :(得分:2)
我想我最后会做的更新这个问题。我得到的感觉是,CORS不是一件容易做的事情(出于安全原因)。关于这个主题的大多数答案都归结为“代理或做CORS”而没有太多解释代理是多么容易。下面是我需要放在我的网站apache文件中以获取所有播放niceley的内容
ProxyPass /api http://api.foo.com/
ProxyPassReverse /api http://api.foo.com/
<Location /api>
Order allow,deny
Allow from all
</Location>
这是对web.foo.com/api的任何请求,apache自动代理将其传递给api.foo com。这意味着不需要任何CORS标头,并且所有cookie都可以正常工作。
这也意味着你仍然有api.foo.com运行其他非javascript查询的软件
这是解决CORS内容需求的一种非常简单的方法,同时仍将内部api与前端分开。