S3 向 S3 发出 POST 请求,响应为 405

Posted

技术标签:

【中文标题】S3 向 S3 发出 POST 请求,响应为 405【英文标题】:S3 POST request to S3 with response 405 【发布时间】:2015-04-20 00:56:56 【问题描述】:

我有以下 S3 的 CORS 配置,以便将我的存储桶之一用作静态网站托管:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
    </CORSRule>
</CORSConfiguration>

然后我有以下编辑重定向规则:

<RoutingRules>
    <RoutingRule>
    <Condition>
        <KeyPrefixEquals>abc</KeyPrefixEquals>
    </Condition>
    <Redirect>
        <HostName>myec2instance.com</HostName>
    </Redirect>
</RoutingRule>

我想要做的是当 S3 接收到 /abc 的 POST 时将请求和请求正文重定向到我的 ec2 实例。重定向规则工作正常(我能够通过将 POST 切换为 GET 请求来测试这一点),但由于任何原因,当请求是 POST 时,S3 返回 HTTPResponse 405。任何想法为什么?

【问题讨论】:

我在重定向后可以找到的有关此错误的引用似乎表明,如果您重定向到文件夹而不是文件,或者重定向到没有默认文档集的文件夹,就会发生这种情况。是其中之一吗? 嗨@monkeymatrix 感谢您的回答!我的问题不是重定向操作(至少我是这么认为的)。对我来说,问题是 S3 作为静态网站主机不允许我从网页内的 javascript 发送 HTTP POST。我想要完成的是创建一个登录页面,用户可以在其中留下他们的联系方式,然后网页通过 POST 将他们的联系方式发送到 S3,最后 S3 重定向到保存发送的 json 数据的 ec2 实例。 【参考方案1】:

这与 CORS 无关——它是 S3 本身。 S3 网站端点仅适用于GETHEAD。在检查重定向规则之前,应拒绝任何其他内容。

网站端点

仅支持对对象的 GET 和 HEAD 请求。

——http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html

【讨论】:

这是否意味着您不能使用 S3 网站托管来转发 POST 请求? @Jake - 正确......虽然我不确定你为什么要“转发”(重定向?)POST,因为这意味着将请求正文重新发送到浏览器端的新位置、花费时间和带宽。您可能想在这里创建一个新问题,描述您的用例以及您要解决的问题。 POST 对 S3 网站端点的请求,即使存在匹配的重定向规则,也会遇到 405 Method Not Allowed 谢谢迈克尔。我正在从托管在 S3 上的前端应用程序中访问后端 REST API。我意识到正确的方法是直接使用 CORS 访问后端,而不需要重定向。 你可以使用API​​网关,Lambda。【参考方案2】:

如果你想使用POST请求S3,你需要在浏览器中使用root对象,通过创建POSTPolicy来获取S3 authentication

您可以参考Browser-Based Upload using HTTP POST

【讨论】:

以上是关于S3 向 S3 发出 POST 请求,响应为 405的主要内容,如果未能解决你的问题,请参考以下文章

S3 REST API HEAD 请求上的 403 禁止错误

Python3 AWS Lambda-向需要VPN的域发出发布请求

向服务器发出 JSON POST 请求,接收二进制响应(Excel 文件),如何下载?

AWS S3 通过预签名 URL 上传返回 400 错误请求

在事务中从 WCF 服务向 REST API 发出 Post 请求

AWS S3 getSignedUrl() 返回 403 禁止错误