CORS XMLHttpRequest 使用 POST 将多部分表单数据发送到 Softlayer 对象存储失败

Posted

技术标签:

【中文标题】CORS XMLHttpRequest 使用 POST 将多部分表单数据发送到 Softlayer 对象存储失败【英文标题】:CORS XMLHttpRequest using POST to send multipart form-data to Softlayer object storage fails 【发布时间】:2016-09-11 03:09:47 【问题描述】:

我在使用HTTP POST 方法将文件存储到对象存储时遇到错误,该方法使用Async XMLHttpRequest 发送。该请求是发送到对象存储公共 URL 的 CORS HTTP 请求,并设置了所需的标头。错误消息说:原因:CORS 标头 Access-Control-Allow-Origin 丢失。

错误似乎发生在使用POST 的多部分表单数据发送请求中。如果使用PUT 创建文件,则会创建所需的文件(资源)。对PUT 请求的响应包含所需的Access-Control-Allow-Origin 标头,而对POST 的响应不包含尽管在容器上设置了元数据属性。

我什至尝试使用X_AUTH_TOKEN 标头而不是X_STORAGE_TOKEN,但失败仍在继续。

通过Softlayer 支持提出了请求,但尚未收到解决方案。解决上述问题的任何想法都会有所帮助。

详情如下:


容器 prod_file 具有以下元数据属性集:

access-control-expose-headers: Access-Control-Allow-Origin
access-control-allow-origin : *
火狐浏览器版本为:Mozilla Firefox 46.0 客户端操作系统是:Linux 3.16.0-71-generic #91~14.04.1-Ubuntu SMP Mon Apr 18 1K9:43:36 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
请求网址:https://*****.objectstorage.softlayer.net/v1/AUTH_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/prod_file/6ffb51fc-e40f-4cf5-982c-44cb5c342851.fl.file.orig.txt 请求 HTTP 方法:POST 使用的机制:异步 XMLHttpRequest

请求标头:

Host: *****.objectstorage.softlayer.net
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
X-Storage-Token: AUTH_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Referer: http://*****myorg******.com/organization/572680760cf26af856c7432c/resources
Content-Length: 4500
Content-Type: multipart/form-data; boundary=---------------------------2139255891192408661525197545
Origin: http://*****myorg******.com
Connection: keep-alive

响应标头:

Connection: keep-alive
Content-Length: 50
Content-Type: text/plain
Date: Sat, 14 May 2016 14:57:02 GMT
X-Trans-Id: *****Some Transaction Id********

错误响应有以下消息:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://*****.objectstorage.softlayer.net/v1/AUTH_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/prod_file/6ffb51fc-e40f-4cf5-982c-44cb5c342851.fl.file.orig.txt. (Reason: CORS header 'Access-Control-Allow-Origin' missing)


提前感谢您的帮助。

【问题讨论】:

Access-Control-Allow-Origin 是一个标头,用于用户代理(浏览器)决定 wheader 实际发送请求,或向客户端(javascript 等)公开/抑制服务器响应,所以 access-control-expose-headers: Access-Control-Allow-Origin不需要在服务器设置中设置。

您好@Michal Foksa

感谢您的改进。需要配置服务器以通知浏览器接受 CORS 请求。对象存储解决方案使用户能够在容器级别设置这些属性。因此为服务器上的容器设置 access-control-expose-headers: Access-Control-Allow-Origin

有趣。我不知道您正在使用的特定服务器,但我所说的在 CORS 中通常是有效的。不客气。 【参考方案1】:

看来您为容器设置了错误的标头,请查看此文档并尝试一下:

http://docs.openstack.org/developer/swift/cors.html

https://swiftstack.com/blog/2013/04/02/using-cors-with-swift/

请记住,softlayer 对象存储基于 Open Stack。

如果您仍有问题,请告诉我

问候

【讨论】:

以上是关于CORS XMLHttpRequest 使用 POST 将多部分表单数据发送到 Softlayer 对象存储失败的主要内容,如果未能解决你的问题,请参考以下文章

为啥浏览器不遵循使用 XMLHTTPRequest 和 CORS 的重定向?

使用 XMLHttpRequest 时没有启用 CORs?

从源访问 XMLHttpRequest 已被 CORS 策略阻止

用于 XmlHttpRequest 的带有 WebAPI 的 CORS

在javascript中使用xmlhttprequest“CORS问题-403禁止”[重复]

带有 XMLHttpRequest 的 CORS 不起作用