【问题标题】:Customize S3 403 message自定义 S3 403 消息
【发布时间】:2016-04-15 19:56:38
【问题描述】:

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

我正在尝试防止热链接到我的 S3 存储桶中的所有文件,因此我将所有内容设为私有,并且只允许用户使用即将到期的 URL 进行访问

当用户尝试重复使用过期的 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 上自定义错误页面?

【问题讨论】:

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


    【解决方案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 到 Internet 的传输与从 S3 到 Internet 的传输价格相同。使用此设置,S3 签名 URL 仍然有效。我的应用程序的额外优势在于,这允许我将我的 SSL 证书与 S3 静态内容一起使用(尽管此功能也可通过 CloudFront 获得),并且代理的访问日志是实时的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 2011-06-26
      • 2019-11-19
      • 2012-12-12
      相关资源
      最近更新 更多