FaceBook通过HTTP POST(S3& CloudFront错误)加载HTTPS托管的iframe应用程序

时间:2013-12-03 01:01:18

标签: facebook facebook-graph-api iframe amazon-web-services amazon-s3

我一直在尝试编写一个允许(X-HTTP-Method-Override)的存储桶策略,因为我的研究显示Facebook通过HTTP POST而非HTTP GET加载HTTPS托管的iframe应用程序,导致S3和CloudFront错误。< / p>

有人可以帮我解决这个问题吗?

如果我直接从S3提供我的Facebook应用程序,这就是从S3返回的内容:

<?xml version="1.0" encoding="UTF-8" ?> 
- <Error>
<Code>MethodNotAllowed</Code> 
<Message>The specified method is not allowed against this resource.</Message> 
<ResourceType>OBJECT</ResourceType> 
<Method>POST</Method> 
<RequestId>B21565687724CCFE</RequestId> 
<HostId>HjDgfjr4ktVxqlIBeIlvXT3UzBNuPg8b+WbhtNHOvNg3cDNpfLH5GIlyUUpJKZzA</HostId> 
</Error>

如果我从CloudFront以S3作为原点提供我的Facebook应用程序,那么这就是从CloudFront返回的内容:

ERROR

无法满足请求。

由cloudfront(CloudFront)生成

我认为解决方案应该是编写一个使用X-HTTP-Method-Override的存储桶策略......可能我错了。这个问题的解决方案将受到高度赞赏。

4 个答案:

答案 0 :(得分:3)

在尝试了许多不同的方法来实现这一点之后,事实证明,根据事情的原因,根本不可能使静态内容的POST工作在S3上。即使您允许通过Cloudfront进行POST,也可以启用CORS,更改存储桶策略,以便Cloudfront原始身份可以GET / PUT等,它仍然会产生错误。

顺便说一下,S3并不是唯一能够回应这种对静态内容的POST请求的东西。如果您将nginx配置为Facebook iframe的原点,您将得到相同的405错误,但您可以在couple of ways中解决该问题(基本上将其重写为GET下的封面)。您还可以将页面(尽管仍然是静态的)更改为动态扩展程序(.aspx.php)以解决nginx问题。

您当然可以在S3上托管所有其他内容,只需将您发布的页面移动到其他来源。有了不错的缓存时间,您应该看到最小的流量,但这意味着将您的内容保存在两个位置。我最终做的是:

  • 在自动扩展组中创建EC2实例(以防万一)以提供内容
  • 他们使用cron作业每隔5分钟同步S3中的内容
  • 不需要更改工作流程(仍然只是将内容上传到S3)

它并不理想,也不是特别有效,但希望它能为其他人提供许多无效的测试,试图让它独自在S3上运行。

答案 1 :(得分:2)

您可以将Cloudfront分配设置为允许POST方法。

如果您进入仪表板并编辑分发的行为   - 然后选择允许的HTTP方法 - GET,HEAD,PUT,POST,PATCH,DELETE,OPTIONS

这允许来自Facebook的POST进入你的原点。

答案 2 :(得分:0)

我最近几天与S3和CloudFront战斗。我确认使用任何存储桶策略我们都无法将POST调用从Facebook重定向到S3静态(JS丰富)内容。

唯一的解决方案似乎是Adam Comerford在这个帖子中提到的那个:

使用轻量级应用程序接收Facebook调用,然后从S3或CloudFront获取内容。

如果有人有任何其他解决方案或想法,将不胜感激。

答案 3 :(得分:-1)

你无法将POST更改为GET - 这就是Facebook加载应用页面的方式,因为它还会将当前用户的数据作为POST正文发送(有关详细信息,请参阅signed_request)。我建议你考虑修复你的应用程序,以确保它正确响应POST请求。