2016-04-15 209 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获得)以及代理的访问日志实时存在。