【问题标题】:FaceBook loads HTTPS hosted iframe apps via HTTP POST (S3 & CloudFront errors)FaceBook 通过 HTTP POST 加载 HTTPS 托管的 iframe 应用程序(S3 和 CloudFront 错误)
【发布时间】:2013-12-03 01:01:18
【问题描述】:

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

谁能帮我解决这个问题?

如果我直接从 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 返回的内容:

错误

无法满足请求。

由云端(CloudFront)生成

我认为解决方案应该是编写一个使用 X-HTTP-Method-Override 的存储桶策略......但可能我错了。对此问题的解决方案将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    在尝试了许多不同的方法来使其工作后,事实证明,就目前的情况而言,根本不可能使静态内容的 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 上工作的徒劳测试。

    【讨论】:

    • CF dist. 有这个问题,谢谢。在第二句第三行中,我认为您的意思是“尽管您可以……”而不是“您一个”。试图编辑,但需要六处修改。
    【解决方案2】:

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

    如果您进入仪表板并编辑分发的行为 - 然后选择Allowed HTTP Methods - GET、HEAD、PUT、POST、PATCH、DELETE、OPTIONS

    这允许来自 Facebook 的 POST 到达您的来源。

    【讨论】:

      【解决方案3】:

      过去几天我一直在使用 S3 和 CloudFront。我确认,使用任何存储桶策略,我们都无法将 POST 调用从 Facebook 重定向到 S3 静态(JS 丰富)内容。

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

      拥有一个接收 Facebook 调用然后从 S3 或 CloudFront 获取内容的轻量级应用程序。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 如问题中所述,应用程序托管在 S3 上,表明支持 POST,但抛出错误
        猜你喜欢
        • 1970-01-01
        • 2022-01-08
        • 2011-06-26
        • 1970-01-01
        • 2017-03-20
        • 2021-05-03
        • 2021-10-01
        • 2012-06-16
        • 1970-01-01
        相关资源
        最近更新 更多