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还需要安全网址。所以为此,我去了云端。
我的配置如下:
就像直接使用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上查看应用程序显示:
我错过了什么吗?
答案 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𷹼
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错误,我做了同样的事情。
编辑CloudFront发行版,转到“错误页面”,并创建3个不同的自定义错误响应,如上所示。
仅供参考,您可以通过CloudFront轻松添加动态方面,从而避免所有CORS问题。 CloudFront can mix both static and dynamic content through the behaviors。
答案 2 :(得分:0)
尝试将页面创建为Lambda函数的响应对象,并使用ApiGateway创建处理页面处理的路径。
将静态内容保留在S3上,将CloudFront保留为SSL支持,将Lambda保留为任何动态页面处理。