簡體   English   中英

如何配置 AWS S3 以允許 POST 像 GET 一樣工作

[英]How to configure AWS S3 to allow POST to work like GET

Facebook 在其畫布設置文檔中聲明:

我們的服務器將向該網址發出 HTTP POST 請求。 檢索到的結果將顯示在 Facebook 的 Canvas 框架內。

我的應用程序作為靜態網站托管在 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請求工作正常,但POSThttp://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 還需要一個安全的網址。 所以為此,我去了cloudfront。

我的配置是這樣的:

雲端配置

更多 Clo​​udfront 配置

就像直接使用 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 在某處運行)提供索引頁面 - 但我還沒有嘗試深入研究那個兔子洞。 如果您仍然必須運行自己的 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&#228988

https://forums.aws.amazon.com/thread.jspa?threadID=62525

希望我們可以在此線程上進行一些活動以證明我錯了,我現在也可以使用它。

我有一個類似的情況,使用單頁 JS 應用程序,其中所有未解決的請求通常應該處理主頁面/index.html

潛在的問題是 S3 不會像 GET 一樣對待 POST。 POST 是一個修改請求。 有一種方法可以配置 S3 來處理 POST,但它用於 S3 修改,而不是像 GET 這樣的只讀請求。

為了處理 POST 請求,我創建了一個 AWS CloudFront 行為,它使用 200 HTTP 響應代碼將錯誤重定向回/index.html 這樣 POST 請求將轉到主頁,並通過應用程序進行管理。 我對 403 和 404 錯誤做了同樣的事情。

AWS CloudFront 錯誤頁面配置

編輯 CloudFront 分配,轉到錯誤頁面,並創建 3 個不同的自定義錯誤響應,如上所示。

僅供參考,您可以通過 CloudFront 輕松添加動態端,避免所有 CORS 問題。 CloudFront 可以通過行為混合靜態和動態內容

嘗試將頁面創建為 Lambda 函數的響應對象,並使用 ApiGateway 創建一個路由來處理頁面處理。

將靜態內容保留在 S3、CloudFront 以提供 SSL 支持和 Lambda 以進行任何動態頁面處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM