Laravel + AngularJS CORS不工作

我正在做一个AngularJS项目,现在在http://localhost ,后端是http://api.localhost ,都是由nginx服务器提供的。

当做一个$ http.post请求时,angular首先进行CORS OPTIONS调用,而且我已经configuration了我的nginx服务器来响应正确的头文件:

  location / { add_header "Access-Control-Allow-Origin" "*"; add_header "Access-Control-Allow-Credentials" "true"; add_header "Access-Control-Allow-Methods" "GET,POST,DELETE,PUT,OPTIONS"; add_header "Access-Control-Allow-Headers" "Keep-Alive,User-Agent,If-Modified-Since,Cache-Control,Content-Type,Authorization"; add_header "Access-Control-Max-Age" "1728000"; if ($request_method = 'OPTIONS') { return 204; } #try_files $uri $uri/ /index.html; try_files $uri /index.php?$query_string; } location = /index.php { add_header "Access-Control-Allow-Origin" "*"; add_header "Access-Control-Allow-Credentials" "true"; add_header "Access-Control-Allow-Methods" "GET,POST,DELETE,PUT,OPTIONS"; add_header "Access-Control-Allow-Headers" "Keep-Alive,User-Agent,If-Modified-Since,Cache-Control,Content-Type,Authorization"; add_header "Access-Control-Max-Age" "1728000"; if ($request_method = 'OPTIONS') { return 204; } ... } 

我的angular度模块也configuration有:

 .config(['$httpProvider', function($httpProvider) { $httpProvider.defaults.useXDomain = true; delete $httpProvider.defaults.headers.common['X-Requested-With']; }]) 

OPTIONS调用按预期返回:

 Access-Control-Allow-Credentials:true Access-Control-Allow-Headers:Keep-Alive,User-Agent,If-Modified-Since,Cache-Control,Content-Type,Authorization Access-Control-Allow-Methods:GET,POST,DELETE,PUT,OPTIONS Access-Control-Allow-Origin:* Access-Control-Max-Age:1728000 Connection:keep-alive Date:Mon, 04 Nov 2013 02:14:16 GMT Server:nginx/1.2.6 (Ubuntu) 

但是后来的POST调用失败,状态为CANCELED,而angular会向JS控制台抛出一个错误:

 `XMLHttpRequest cannot load http://api.localhost/users/accesstokens. Origin http://localhost is not allowed by Access-Control-Allow-Origin.` 

我昨天晚上熬夜了,并得到了这个工作,但是当我今天再次尝试时,又回到了原点。 最糟糕的问题!

做什么?

编辑:我发现了这个问题,但我仍然不明白。 我查看了我的nginx访问日志,并且看到POST请求实际上正在服务器上,即使状态是CANCELED。 我也看到了答复是401,得到我的请求正确后,答复是201.仍然是相同的取消状态。 但是当我调整到200的时候,瞧! 请求按预期工作。

AngularJS在一个跨域请求中只接受200个状态是有原因的吗?

Angular.js $ http服务认为有效的任何状态在200和299之间,你可以在$ http源代码中看到它; 在这里和这里,我无法找到其他地方硬编码的状态200。

尽管Chrome控制台的消息,这个问题可能是Alistair Robinson 在这篇文章中指出的问题检查你的nginx是否更新到最新的稳定版本,然后检查是否正确发送“Content-Length”标头,如果不是,我将与Alistair解决方案一起手动填充Content-Length标题。