2016-04-15 251 views
0

我有一個網站託管在Heroku上,並使用Ruby on Rails與paperclip寶石。自定義S3 403消息

我想防止盜鏈到我在我的S3存儲桶中的所有文件,所以我對私人,只允許用戶都使用過期網址

訪問我想提供一個更人性化,當頁面用戶嘗試重複使用過期的URL。目前它顯示下面的消息:

<Error> 
<Code>AccessDenied</Code> 
<Message>Request has expired</Message> 
<X-Amz-Expires>300</X-Amz-Expires> 
<Expires>2016-04-15T19:41:33Z</Expires> 
<ServerTime>2016-04-15T19:41:39Z</ServerTime> 
<RequestId>D5DD935553A2CF88</RequestId> 
<HostId> 
55+rFtFbksDMyBWf5cWwgJ+aWvJKwe5umSXgTEWYKgfoT5QR5sbJY9fRNFIiBAqd35OR2MoiCzQ= 
</HostId> 
</Error> 

有沒有辦法在S3上自定義錯誤頁面?

回答

1

S3通過網站端點提供自定義錯誤頁面 - 但不是REST端點......但簽名的URL只能在REST端點上使用,而不能在網站端點上使用。

所以,不,沒有辦法直接解決這個問題,只用S3。

一種選擇是使用CloudFront,它可以使用自定義靜態頁面替換標準錯誤頁面,但錯誤內容會丟失,您擁有的只是一個靜態頁面。您還必須使用與S3不同的CloudFront URL簽名機制(雖然它也具有一些優點,例如簽名URL中的通配符支持)。

this answer to a question that is similar, but not a complete duplicate我演示了我使用XSL轉換來「設計」S3錯誤XML的方式,方法是修改返回到瀏覽器的XML,向XSL樣式表注入鏈接,然後讓瀏覽器執行其他操作的工作...看到屏幕截圖。

我對解決方案很滿意,雖然它有些人會考慮一個缺點 - 它要求所有的S3請求都通過代理服務器在EC2中運行HAProxy來提供。由於從S3到EC2的轉移是免費的,從EC2到互聯網的轉移與從S3轉移到互聯網的價格相同,因此EC2實例需要額外的小額費用,但是沒有增加帶寬成本。通過這種設置,S3簽名的URL仍然有效。在我的應用程序中,我們可以使用具有S3靜態內容的SSL證書(雖然此功能也可通過CloudFront獲得)以及代理的訪問日誌實時存在。