【问题标题】:AWS S3 - CORS OPTIONS Preflight throwing 400 Bad Request during DELETE w/ VersionIdAWS S3 - CORS OPTIONS Preflight throwing 400 Bad Request during DELETE w/ VersionId
【发布时间】: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: 我尝试添加&lt;AllowedMethod&gt;OPTIONS&lt;/AllowedMethod&gt;,但亚马逊返回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 方法传递参数的问题。以防万一,试试&lt;AllowedMethod&gt;OPTIONS&lt;/AllowedMethod&gt; :)
  • @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


【解决方案1】:

我刚刚遇到了这个问题。它只发生在 Chrome 上。太棒了。

解决方案是将以下内容添加到您在 AWS 中的相关 &lt;CORSRule&gt; 配置中:

<AllowedHeader>*</AllowedHeader>

这使得 Chrome 不发送 OPTIONS 请求,一切都应该正常工作。

【讨论】:

  • 作为评论,此配置是通过转到您的 s3 存储桶,单击 PropertiesPermissionsEdit CORS Configuration 来设置的
  • 我得到 206 部分内容
  • 这没有帮助。我希望是的。
  • 显然 chrome 和 s3 协商 CORS 之间存在一些问题。这个答案充分解释了它并提供了一些替代方案:serverfault.com/a/856948
  • @tmont 我真的怀疑 S3 存储桶上的 CORS 规则会使 Chrome 停止发送 OPTIONS 请求,因为 Chrome 首先不知道此规则,而 OPTIONS 是预检方法 - 它必须始终执行,根据我对机制的理解。
猜你喜欢
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多