angularjs - CORS 预检返回 200 但后续 PUT 永远不会发生(具有外部 REST API 的 Angular JS)

标签 angularjs http nginx xmlhttprequest cors

我正在使用一个与 REST API 对话的 Angular 应用

我已经设置了访问控制,以便我的 GET 请求按预期工作。 (浏览器发送预检 OPTIONS 请求,然后触发后续的 GET)。

但是,我的 PUT 遇到了问题。

问题是,使用 PUT 时,选项预检似乎返回正常,但 PUT 永远不会触发。

首先我将展示什么是有效的,然后是什么是失败的。我正在利用 Charles 来监视通话。


获取(工作)

1) 预检请求

OPTIONS /v1/account HTTP/1.1
Host    api.mysite.com
Access-Control-Request-Method   GET
Origin  http://127.0.0.1:9000
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36
Access-Control-Request-Headers  accept, authorization
Accept  */*
Referer http://127.0.0.1:9000/
Accept-Encoding gzip,deflate,sdch
Accept-Language en-US,en;q=0.8

2) 飞行前响应

HTTP/1.1 200 OK
Server  nginx/1.6.0
Date    Wed, 21 May 2014 15:43:25 GMT
Content-Type    application/octet-stream
Content-Length  0
Connection  keep-alive
Access-Control-Allow-Origin *
Access-Control-Allow-Methods    *
Access-Control-Allow-Headers    Origin, X-Requested-With, Content-Type, Accept, Authorization, WWW-Authenticate, X-BLURR-DEBUG
Access-Control-Allow-Credentials    true

3)GET请求

GET /v1/account HTTP/1.1
Host    api.mysite.com
Accept  application/json, text/plain, */*
Origin  http://127.0.0.1:9000
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36
AUTHORIZATION   DFHD8D...
Referer http://127.0.0.1:9000/
Accept-Encoding gzip,deflate,sdch
Accept-Language en-US,en;q=0.8

4) GET 响应

{ some json as expected }

PUT(不起作用)

现在,这里的 PUT 似乎返回了一个不错的预检响应,但从未到达 PUT 请求:

1) 预检请求

OPTIONS /v1/account HTTP/1.1
Host    api.mysite.com
Access-Control-Request-Method   PUT
Origin  http://127.0.0.1:9000
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36
Access-Control-Request-Headers  accept, authorization, content-type
Accept  */*
Referer http://127.0.0.1:9000/
Accept-Encoding gzip,deflate,sdch
Accept-Language en-US,en;q=0.8

2) 飞行前响应

HTTP/1.1 200 OK
Server  nginx/1.6.0
Date    Wed, 21 May 2014 15:51:41 GMT
Content-Type    application/octet-stream
Content-Length  0
Connection  keep-alive
Access-Control-Allow-Origin *
Access-Control-Allow-Methods    *
Access-Control-Allow-Headers    Origin, X-Requested-With, Content-Type, Accept, Authorization, WWW-Authenticate, X-BLURR-DEBUG
Access-Control-Allow-Credentials    true

问题

看起来 PUT 的预检响应没问题,所以我不确定为什么浏览器从不发送实际 PUT 请求。

任何帮助或指导都会很棒!谢谢

最佳答案

*(星号)不是 Access-Control-Allow-Methods header 的有效值。您需要列出实际的方法(例如 GET、PUT)。看起来虽然服务器的预检响应成功,但浏览器可能仍然拒绝预检并且不发送实际的请求。检查浏览器的控制台日志是否有任何错误。

关于angularjs - CORS 预检返回 200 但后续 PUT 永远不会发生(具有外部 REST API 的 Angular JS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23788387/

相关文章:

php - $_SERVER ['REMOTE_ADDR' ] 不适用于 php-fpm 和 nginx

angularjs - 从 Angular Factory 遍历 JSON 数据

angularjs - 使用 Angularjs 对可编辑行表单进行验证

javascript - 从element指令中的routeProvider获取参数

android - Spring Boot 上的 Controller 415 不支持的媒体类型

ubuntu - 连接到我的 Ubuntu 实例时浏览器抛出异常

javascript - AngularJS 在 JSON 文件上嵌套 ng-repeat 和 ng-if

java - 从 Java Servlet 返回字符串数组到 jQuery

javascript - 无法读取嵌套函数内 'get' $http 的属性

python Tornado 处理程序 IO 阻塞整个服务器网络