自定义S3 403消息

时间:2016-04-15 19:56:39

标签: ruby-on-rails amazon-s3 paperclip http-status-code-403

我有一个在Heroku上托管的网站,并使用带有paperclip gem的Ruby on Rails。

我正在尝试阻止热链接到我的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 个答案:

答案 0 :(得分: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样式表的链接,以及让浏览器做剩下的工作......看屏幕截图。

我对这个解决方案非常满意,虽然它有一些人会认为是一个缺点 - 它要求通过在EC2中运行HAProxy的代理服务器来提供所有S3请求。 EC2实例的额外成本很小,但没有额外的带宽成本,因为从S3到EC2的转移是免费的,从EC2到互联网的转移与从S3转移到互联网的价格相同。通过此设置,S3签名URL仍然有效。我的应用程序中的其他优点是,这使我可以将我的SSL证书与S3静态内容一起使用(虽然此功能也可通过CloudFront获得),以及代理的访问日志是实时的。