服务器返回 CORS 标头,浏览器仍然抛出 Cross-Origin Request Blocked 错误

Posted

技术标签:

【中文标题】服务器返回 CORS 标头,浏览器仍然抛出 Cross-Origin Request Blocked 错误【英文标题】:Server return CORS headers, browser still throwing Cross-Origin Request Blocked error 【发布时间】:2015-06-12 09:28:57 【问题描述】:

我是 java 脚本和 CORS 的新手,并且在一段时间内遇到了这个问题。我做了很多阅读,但没有运气。客户端在浏览器 (Chrome/Firefox) 中运行并发出 PUT 请求,导致 OPTION 和 PUT 请求。服务器正在将 PUT 请求重定向到另一台服务器。以下是基于 java 脚本的客户端和基于 java 的服务器之间的 HTTP 通信捕获:

选项请求:

Host: 10.232.65.230:8000
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://10.232.65.230:3001
Access-Control-Request-Method: PUT
Connection: keep-alive

选项响应:

Status Code: 200
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Origin: http://10.232.65.230:3001
Access-Control-Max-Age: 1800
Cache-Control: private
Content-Length: 0
Date: Tue, 07 Apr 2015 13:48:50 GMT
Expires: Thu, 01 Jan 1970 05:30:00 IST
Server: Apache-Coyote/1.1

PUT 请求:

Host: 10.232.65.230:8000
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://10.232.65.230:3001/ermsim/erms/1/edgedevices
Content-Length: 159
Content-Type: text/plain; charset=UTF-8
Origin: http://10.232.65.230:3001
Connection: keep-alive

PUT 响应:

Status Code: 302
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Origin: http://10.232.65.230:3001
Cache-Control: private
Content-Length: 0
Content-Type: application/xml
Date: Tue, 07 Apr 2015 13:48:50 GMT
Expires: Thu, 01 Jan 1970 05:30:00 IST
Location: http://10.232.65.230:8000/edge/ermsim/erms/1/edgedevices/1/config/edgeinputs/1
Server: Apache-Coyote/1.1

但是,浏览器没有重定向到提供的位置,而是抛出以下错误:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://10.232.65.230:8000/ermsim/erms/1/edgedevices/1/config/edgeinputs/1. This can be fixed by moving the resource to the same domain or enabling CORS.

我将不胜感激!

【问题讨论】:

确保使用cross-domain.xml文件 是否需要 cross-domain.xml 文件?服务器正在返回正确的标头以响应 OPTION 请求。 【参考方案1】:

您发送的返回码是否不等于 200?

响应的 HTTP 状态码不在 2xx 范围内

应用网络错误步骤。

CORS 对代码 2xx 有限制:http://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0

【讨论】:

OPTION 请求返回状态码 200,PUT 返回 302。抱歉,我错过了为 OPTION 和 PUT 请求添加状态码。已更新相关问题。 我认为 CORS-preflight 的状态码和实际请求必须相同。

以上是关于服务器返回 CORS 标头,浏览器仍然抛出 Cross-Origin Request Blocked 错误的主要内容,如果未能解决你的问题,请参考以下文章

CORS:预检通过,主请求完成 w/200,但浏览器仍然有 Origin 错误

在 Node.js Express.js 服务器中添加标头后,Chrome 中仍然出现 CORS 错误

AWS API Gateway 429 响应 - 没有 CORS 标头

hapi.js Cors Pre-flight 不返回 Access-Control-Allow-Origin 标头

在 AWS EC2 中添加 CORS 标头的位置

对 CORS 请求的 304 Not Modified 响应是不是应该包含 CORS 标头?