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
。
看来您为容器设置了错误的标头,请查看此文档并尝试一下:
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 的带有 WebAPI 的 CORS