【发布时间】:2014-04-06 20:06:18
【问题描述】:
我正在尝试使用对象的 Key 和删除标记的 VersionID 对删除标记进行 deleteObject 请求。
由于 CORS,浏览器 (Chrome 34.0.1847.11) 将 OPTIONS 预检请求发送到: http://bucket.s3-us-west-2.amazonaws.com/Folder/File.ext?versionId=0123456789
Amazon S3 使用以下 XML 正文响应 400(错误请求):
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>InvalidArgument</Code>
<Message>This operation does not accept a version-id.</Message>
<ArgumentValue>0123456789</ArgumentValue>
<ArgumentName>versionId</ArgumentName>
<RequestId>12345</RequestId>
<HostId>1122334455</HostId>
</Error>
因为 XMLHttpRequest 返回 400(错误请求),所以 DELETE 请求永远不会被执行。我的印象是 AWS 没有正确处理选项请求。如果有解决方法,那就太好了!
我当前对存储桶的 CORS 政策是:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
仅供参考:我正在使用适用于 JS 2.0.0-rc10 的 AWS 开发工具包
提前谢谢你。
编辑 1:
我尝试添加<AllowedMethod>OPTIONS</AllowedMethod>,但亚马逊返回Found unsupported HTTP method in CORS config. Unsupported method is OPTIONS
编辑 2:
OPTIONS 请求/响应标头:
Remote Address: *********:443
Request URL: https://bucket.s3-us-west-2.amazonaws.com/path/to/file_name?versionId=0123456789
Request Method: OPTIONS
Status Code: 400 Bad Request
Request Headers
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Access-Control-Request-Headers: x-amz-user-agent, x-amz-security-token, x-amz-date, authorization, content-type
Access-Control-Request-Method: DELETE
Cache-Control: no-cache
Connection: keep-alive
DNT: 1
Host: bucket.s3-us-west-2.amazonaws.com
Origin: https://website.com
Pragma: no-cache
Referer: https://website.com/
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.60 Safari/537.36
Query String Parameters
versionId: 0123456789
Response Headers
Access-Control-Allow-Headers: x-amz-user-agent, x-amz-security-token, x-amz-date, authorization, content-type
Access-Control-Allow-Methods: HEAD, GET, PUT, POST, DELETE
Access-Control-Allow-Origin: *
Connection: close
Content-Type: application/xml
Date: Tue, 18 Mar 2014 23:59:15 GMT
Server: AmazonS3
Transfer-Encoding: chunked
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-id-2: *************************
x-amz-request-id: ***********
由于 OPTIONS 失败,删除请求实际上从未发生过。
【问题讨论】:
-
请包含 OPTIONS 和 DELETE 请求的所有 HTTP 请求和响应标头。顺便说一句,我听说过为 DELETE 方法传递参数的问题。以防万一,试试
<AllowedMethod>OPTIONS</AllowedMethod>:) -
@Adam - 请参阅编辑 1 和编辑 2。请注意,库/浏览器实际上永远不会调用 DELETE,因为 OPTIONS 飞行前失败。在 OPTIONS 飞行前没有 versionId GET 参数的正常删除工作非常好。
-
根据 the docs 它应该可以工作。尝试在请求正文中传递 versionId 参数(如使用 POST)而不是查询字符串。这样它就不会被 CORS 规则检查,这并不意味着它会起作用。您还可以使用网络嗅探器检查较低级别的流量(有时浏览器会撒谎)。
-
@Adam - 我自己不生成任何请求,我相信当您执行 DELETE 请求时,由于 CORS,浏览器会自动生成 OPTIONS 请求。我正在为此使用 Amazons SDK。
-
是的,OPTIONS 请求是自动生成的,无法绕过。我想 SDK 会为您创建 DELETE 请求,因此您没有太多控制权,但您始终可以使用 jQuery 或纯 XMLHttpRequest 对象创建自定义请求。也尝试使用不同的浏览器。我还看到了非标准的
DNT标头 - 尝试暂时禁用 Do Not Track 选项。
标签: javascript amazon-web-services amazon-s3 xmlhttprequest cors