如何配置AWS S3以允许POST像GET一样工作

时间:2016-04-04 13:42:10

标签: amazon-web-services amazon-s3 facebook-canvas

Facebook在其画布设置文档中说明:

  

我们的服务器会向此网址发出HTTP POST请求。该   检索到的结果将显示在Canvas框架中   主页。

我的应用程序作为静态网站托管在AWS S3上,使用以下CORS配置:

$app->get('/blog/{id}', function (Silex\Application $app, $id) {
  // access $id here
})

我这里已经有问题了。 <?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> <AllowedMethod>HEAD</AllowedMethod> <MaxAgeSeconds>3000</MaxAgeSeconds> <AllowedHeader>Authorization</AllowedHeader> </CORSRule> </CORSConfiguration> 请求工作完美无缺,但GET http://my-bucket-name.s3-website-us-east-1.amazonaws.com会回来:

POST

步骤1:^我认为我需要让这个工作。

但等等,还有更多

Facebook还需要安全网址。所以为此,我去了云端。

我的配置如下:

Cloudfront Configuration

More Cloudfront Configuration

就像直接使用S3一样,向https://app-cloudfront-id.cloudfront.net/提出<html> <head> <title>405 Method Not Allowed</title> </head> <body> <h1>405 Method Not Allowed</h1> <ul> <li>Code: MethodNotAllowed</li> <li>Message: The specified method is not allowed against this resource.</li> <li>Method: POST</li> <li>ResourceType: OBJECT</li> <li>RequestId: 94159551A72424C7</li> <li>HostId: +Lcz+XaAzL97Y47OZFvaTwqz4Z7r5koaJGHjZJBBMOTUHyThTfKbZG6IxJtYEbtsXWcb/bFxeI8=</li> </ul> <hr/> </body> </html> 请求就像一个冠军,POST,踢回来:

GET

在facebook.com上查看应用程序显示:

app on facebook

我错过了什么吗?

3 个答案:

答案 0 :(得分:5)

所以 - 我也认为这应该很容易并且在2016年得到AWS的良好支持。显然,从我所做的所有阅读中,我们都错了。

无论是否支持cloudfront,都无法为s3的facebook应用程序提供索引页面。

也许可以通过cloudfront和s3中的其他所有内容从备用源(即你自己的某个地方运行的httpd)提供索引页面 - 但我还没有尝试深入研究那个兔子洞。如果您仍然需要运行自己的HA httpd ......根据您的资产规模,复杂性可能不值得。即http://www.bucketexplorer.com/documentation/cloudfront--how-to-create-distributions-post-distribution-with-multiple-origin-servers.html

你可以在你自己的源头上使用cloudfront httpd服务静态内容以利用缓存和边缘分布 - 它只会将POST(和PUT等)转发到你的源并绕过缓存边缘。

这些答案很老,大约在2011年,但我找不到任何证据表明此事发生了任何变化。

https://forums.aws.amazon.com/thread.jspa?messageID=228988&#228988

https://forums.aws.amazon.com/thread.jspa?threadID=62525

希望我们可以在这个帖子上进行一些活动来证明我的错误,我现在也可以使用它。

答案 1 :(得分:1)

使用单页JS应用程序时,我遇到类似的情况,通常所有未解决的请求都应在主页/index.html上处理。

潜在的问题是S3不像GET那样对待POST。 POST是一个修改请求。有一种方法可以配置S3来处理POST,但这仅用于S3修改,而不是像GET这样的只读请求。

为了处理POST请求,我创建了一个AWS CloudFront行为,该行为使用200 HTTP响应代码将错误重定向回/index.html。这样,POST请求将转到主页,并通过应用程序进行管理。对于403和404错误,我做了同样的事情。

AWS CloudFront Error Page Configuration

编辑CloudFront发行版,转到“错误页面”,并创建3个不同的自定义错误响应,如上所示。

仅供参考,您可以通过CloudFront轻松添加动态方面,从而避免所有CORS问题。 CloudFront can mix both static and dynamic content through the behaviors

答案 2 :(得分:0)

尝试将页面创建为Lambda函数的响应对象,并使用ApiGateway创建处理页面处理的路径。

将静态内容保留在S3上,将CloudFront保留为SSL支持,将Lambda保留为任何动态页面处理。