如何使用Rails从S3或Cloudfront向用户发送HTML文件?

时间:2013-01-08 02:31:14

标签: ruby-on-rails ruby amazon-s3 amazon-cloudfront

我想简单地将用户重新路由到一个页面(比如bucket.amazons3.com/hello.html),同时仍然让它看起来像是在DOMAIN.COM/hello.html ...我想要这样做,如果某个IF条件通过..

例如:

if (RAILS == "cool") && (S3.exists?("hello.html"))
 send_to_s3
end

其中“send_to_s3”只是将用户重定向到Amazon Cloudfront或S3并在其浏览器中呈现“hello.html”页面。但他们觉得他们从未离开我的网站..

现在想象一下,我想用Hello1.html,Hello2.html,Hello3.html ..... Hello20Million.html ...

做同样的行为

如何在不显着增加服务器负载的情况下有效地执行此操作?

如何在像Thin / Puma / Webrick这样的服务器上运行的RAILS中执行此操作?

1 个答案:

答案 0 :(得分:2)

有两种方法可以做到这一点:

  1. 在视图中使用指向S3网址的iframe。
  2. 向amazon网址发送服务器端请求,并将响应呈现为您的某个rails视图。
  3. 第一个选项很简单。如果满足您的条件,则打开一个rails视图,其中包含一个嵌入式iframe,其src属性指向S3 URL。您必须在JS中动态处理iframe尺寸(宽度x高度),以便为用户提供无缝体验(窗口调整大小等)。

    在第二个选项中,您实际上可以使用open-uri通过ruby请求S3 URL,然后将您获得的响应呈现在您自己的视图中。要请求文件URL,请使用以下代码:

    require 'open-uri'
    url_response = open('http://example.com/file_to_read.htm').read
    

    在您的视图中,您需要呈现url_response

    <%= url_response.html_safe %>
    

    使用html_safe告诉rails您要按原样输出字符串而不进行任何编码,以使其安全。

    使用其中任何一个选项都会使显示,就像请求来自您的服务器一样。

    P.S:我也想知道也可以通过使用.htaccess或类似的URL重写或代理传递来执行此操作,但在您的问题中,您已经专门询问了“Rails”。