如何配置 AWS S3 以允许 POST 像 GET 一样工作
How to configure AWS S3 to allow POST to work like GET
Facebook 在其 canvas 设置文档中声明:
Our servers will make an HTTP POST request to this web address. The
retrieved result will be displayed within the Canvas frame on
Facebook.
我的应用程序作为静态网站托管在 AWS 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>
<AllowedMethod>HEAD</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
我已经遇到问题了。 GET
请求完美运行,但 POST
到 http://my-bucket-name.s3-website-us-east-1.amazonaws.com 反击:
<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>
第 1 步:^ 我想我需要让它正常工作。
等等,还有更多
Facebook 还需要 安全 url。所以为此,我去了cloudfront。
我的配置是这样的:
就像直接使用 S3 一样,向 https://app-cloudfront-id.cloudfront.net/ 发出 GET
请求就像冠军一样工作,POSTing,反击:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>MethodNotAllowed</Code>
<Message>The specified method is not allowed against this resource.</Message>
<Method>POST</Method>
<ResourceType>OBJECT</ResourceType>
<RequestId>657E87A80AFBB3B0</RequestId>
<HostId>SY2g4smvhr06kAAQYVMsYeQZ+pSKbIIvsh/OaPBiMADGt5UKut0sXSZkFsnFmcRXQ2PFBVgPK4M=</HostId>
</Error>
在 facebook.com 上查看应用显示:
我是不是漏掉了什么?
所以 - 我也认为这应该很容易,并且在 2016 年得到 AWS 的良好支持。显然,根据我所做的所有阅读,我们错了。
无法从 s3 为 facebook 应用程序提供索引页面 - 无论是否有 cloudfront。
可能可以通过 cloudfront 和 s3 中的其他所有内容从备用来源(即您自己的 httpd 运行ning 某处)提供索引页面 - 但我还没有尝试深入研究兔子洞。如果您仍然需要 运行 自己的 HA httpd...根据您的资产规模,复杂性可能不值得。即http://www.bucketexplorer.com/documentation/cloudfront--how-to-create-distributions-post-distribution-with-multiple-origin-servers.html
你 - 可以 - 在你自己的源 httpd 前面使用 cloudfront 服务静态内容以利用缓存和边缘分布 - 它只会将 POST (和 PUT 等)转发到你的源并绕过缓存边缘。
这些答案是旧的,大约在 2011 年,- 但我找不到任何证据表明任何事情都因此发生了变化。
https://forums.aws.amazon.com/thread.jspa?messageID=228988𷹼
https://forums.aws.amazon.com/thread.jspa?threadID=62525
希望我们可以在此线程上得到一些 activity 来证明我是错误的,我现在也可以使用它。
尝试将页面创建为 Lambda 函数的响应对象,并使用 ApiGateway 创建路由来处理页面处理。
将静态内容保留在 S3 上,CloudFront 用于 SSL 支持,Lambda 用于任何动态页面处理。
我有类似的情况,使用单页 JS 应用程序,其中所有未解决的请求通常应该在主页处理,/index.html
。
潜在的问题是 S3 不会像 GET 那样对待 POST。 POST 是一个修改请求。有一种方法可以配置 S3 来处理 POST,但这是针对 S3 修改的,而不是像 GET 这样的只读请求。
为了处理 POST 请求,我创建了一个 AWS CloudFront 行为,使用 200 HTTP 响应代码将错误重定向回 /index.html
。这样 POST 请求将转到主页,并通过应用程序进行管理。我对 403 和 404 错误做了同样的事情。
编辑 CloudFront 分配,转到错误页面,并创建 3 个不同的自定义错误响应,如上所示。
仅供参考,您可以通过 CloudFront 轻松添加动态端,从而避免所有 CORS 问题。
。
Facebook 在其 canvas 设置文档中声明:
Our servers will make an HTTP POST request to this web address. The retrieved result will be displayed within the Canvas frame on Facebook.
我的应用程序作为静态网站托管在 AWS 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>
<AllowedMethod>HEAD</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
我已经遇到问题了。 GET
请求完美运行,但 POST
到 http://my-bucket-name.s3-website-us-east-1.amazonaws.com 反击:
<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>
第 1 步:^ 我想我需要让它正常工作。
等等,还有更多
Facebook 还需要 安全 url。所以为此,我去了cloudfront。
我的配置是这样的:
就像直接使用 S3 一样,向 https://app-cloudfront-id.cloudfront.net/ 发出 GET
请求就像冠军一样工作,POSTing,反击:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>MethodNotAllowed</Code>
<Message>The specified method is not allowed against this resource.</Message>
<Method>POST</Method>
<ResourceType>OBJECT</ResourceType>
<RequestId>657E87A80AFBB3B0</RequestId>
<HostId>SY2g4smvhr06kAAQYVMsYeQZ+pSKbIIvsh/OaPBiMADGt5UKut0sXSZkFsnFmcRXQ2PFBVgPK4M=</HostId>
</Error>
在 facebook.com 上查看应用显示:
我是不是漏掉了什么?
所以 - 我也认为这应该很容易,并且在 2016 年得到 AWS 的良好支持。显然,根据我所做的所有阅读,我们错了。
无法从 s3 为 facebook 应用程序提供索引页面 - 无论是否有 cloudfront。
可能可以通过 cloudfront 和 s3 中的其他所有内容从备用来源(即您自己的 httpd 运行ning 某处)提供索引页面 - 但我还没有尝试深入研究兔子洞。如果您仍然需要 运行 自己的 HA httpd...根据您的资产规模,复杂性可能不值得。即http://www.bucketexplorer.com/documentation/cloudfront--how-to-create-distributions-post-distribution-with-multiple-origin-servers.html
你 - 可以 - 在你自己的源 httpd 前面使用 cloudfront 服务静态内容以利用缓存和边缘分布 - 它只会将 POST (和 PUT 等)转发到你的源并绕过缓存边缘。
这些答案是旧的,大约在 2011 年,- 但我找不到任何证据表明任何事情都因此发生了变化。
https://forums.aws.amazon.com/thread.jspa?messageID=228988𷹼
https://forums.aws.amazon.com/thread.jspa?threadID=62525
希望我们可以在此线程上得到一些 activity 来证明我是错误的,我现在也可以使用它。
尝试将页面创建为 Lambda 函数的响应对象,并使用 ApiGateway 创建路由来处理页面处理。
将静态内容保留在 S3 上,CloudFront 用于 SSL 支持,Lambda 用于任何动态页面处理。
我有类似的情况,使用单页 JS 应用程序,其中所有未解决的请求通常应该在主页处理,/index.html
。
潜在的问题是 S3 不会像 GET 那样对待 POST。 POST 是一个修改请求。有一种方法可以配置 S3 来处理 POST,但这是针对 S3 修改的,而不是像 GET 这样的只读请求。
为了处理 POST 请求,我创建了一个 AWS CloudFront 行为,使用 200 HTTP 响应代码将错误重定向回 /index.html
。这样 POST 请求将转到主页,并通过应用程序进行管理。我对 403 和 404 错误做了同样的事情。
编辑 CloudFront 分配,转到错误页面,并创建 3 个不同的自定义错误响应,如上所示。
仅供参考,您可以通过 CloudFront 轻松添加动态端,从而避免所有 CORS 问题。