为什么Ember.js不能从我的服务器看到Access-Control-Allow-Origin标头?

时间:2014-09-24 15:38:38

标签: ember.js cors

我的应用是一个Ember.js前端,在服务器上有一个Go API。我使用FixtureAdapter创建了Ember应用程序。现在我已经使用Go API后端,我将其转换为RESTAdapter。

当我直接使用浏览器点击我的API时,我似乎得到了相应的CORS标题:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:Origin,x-requested-with
Access-Control-Allow-Methods:PUT,PATCH,GET,POST
Access-Control-Allow-Origin:*
Access-Control-Expose-Headers:Content-Length

然而,当我的Ember.js应用程序访问API时,我得到XMLHttpRequest cannot load https://192.168.59.103:8001/notifications. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://192.168.59.103:9000' is therefore not allowed access.

我不知道怎么看Ember和AP​​I之间发生了什么。我已阅读this CORS tutorial,服务器端的一切似乎都没问题。

由于另一个Stack Overflow问题提示jQuery请求需要与普通旧JavaScript请求不同的东西,因此我包含了关于x-requested-with的位。

2 个答案:

答案 0 :(得分:2)

您是否碰巧使用Nginx作为API的反向代理?如果是这样,我们遇到了同样的问题。在我们的例子中,问题是Nginx返回正确的CORS头文件对于HTTP 200 OK响应很好,但是对于任何错误响应,它将无法添加COR头,因此实际的服务器响应会被浏览器抱怨模糊它没有适当的CORS标头来呈现响应。

请参阅https://serverfault.com/a/431580/199943

即使你没有使用Nginx,也可以尝试直接调用你的API(例如使用Postman来避免CORS限制以查看它返回的内容。如果你的API返回HTTP 200 OK以外的任何内容,这可能就是为什么没有添加CORS头文件。

答案 1 :(得分:2)

您的端点还需要使用CORS标头响应OPTIONS请求 - 这些请求将在实际请求之前执行,以确保首先允许请求。