【发布时间】:2012-10-30 13:06:05
【问题描述】:
我正在构建一个基于 Backbone.js 的应用程序并遇到一个奇怪的问题。
在某个时刻,应用程序请求收集资源,但在 Chrome(和 Safari)中,我收到如下错误:
XMLHttpRequest cannot load http://api.mydomain.net/v1/foos/00000d/bars/000014/boots Origin http://localhost:3501 is not allowed by Access-Control-Allow-Origin.
好的,我想到了 CORS 问题并将其归咎于我的 API。然后通过 CURL 请求这个资源:
curl -i -H'Accept: application/json' -H'X-Auth-Token: pAWp5hrCmXA83GgFzgHC' -XOPTIONS 'http://api.mydomain.net/v1/foos/00000d/bars/000014/boots'
HTTP/1.1 200 OK
Status: 200
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Auth-Token
Content-Length: 0
看起来不错,现在是 GET:
curl -i -H'Accept: application/json' -H'X-Auth-Token: pAWp5hrCmXA83GgFzgHC' -XGET 'http://api.mydomain.net/v1/foos/00000d/bars/000014/boots'
HTTP/1.1 204 No Content
Status: 204
Cache-Control: no-cache
Content-Length: 0
Content-Type: text/plain
如果我请求包含至少一个对象的靴子集合,一切正常。我的服务器的 CORS 标头以 arr 响应,我认为完全没问题。那么为什么浏览器会报跨源资源问题呢?
是不是因为我的 204 条回复的内容类型 text/plain?
【问题讨论】:
-
确保问题确实是由 CORS 引起的,而不是某些服务器端故障。使用
--disable-web-security标志运行 Chrome 并仔细检查服务器的响应。 -
不幸的是,OSX 上最新的 Chrome(非开发版)在使用该命令行开关启动时会死机。
-
检查服务器的错误日志。
-
Serverlog 很好:在 2012-11-10 11:33:04 +0100 开始 GET "/v1/foos/00000d/bars/000014/boots" for 93.219.xxx.yyy 由 V1 处理::BootsController#index as JSON 参数:{"foo_id"=>"00000d", "bar_id"=>"000014"} 渲染文本模板 (0.0ms) 完成 204 No Content in 7ms (Views: 0.4ms)
-
所以,服务器不是问题的原因。
标签: javascript ajax backbone.js xmlhttprequest cors