我一直在尝试编写一个允许(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的存储桶策略......可能我错了。这个问题的解决方案将受到高度赞赏。
答案 0 :(得分:3)
在尝试了许多不同的方法来实现这一点之后,事实证明,根据事情的原因,根本不可能使静态内容的POST工作在S3上。即使您允许通过Cloudfront进行POST,也可以启用CORS,更改存储桶策略,以便Cloudfront原始身份可以GET / PUT等,它仍然会产生错误。
顺便说一下,S3并不是唯一能够回应这种对静态内容的POST请求的东西。如果您将nginx
配置为Facebook iframe的原点,您将得到相同的405错误,但您可以在couple of ways中解决该问题(基本上将其重写为GET下的封面)。您还可以将页面(尽管仍然是静态的)更改为动态扩展程序(.aspx
或.php
)以解决nginx问题。
您当然可以在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请求。