【问题标题】:How do I send a user an HTML file from S3 or Cloudfront using Rails?如何使用 Rails 从 S3 或 Cloudfront 向用户发送 HTML 文件?
【发布时间】:2012-12-21 20:32:44
【问题描述】:

我想简单地将用户重新路由到一个页面(比如 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 中执行此操作?

【问题讨论】:

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


    【解决方案1】:

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

    1. 在您的视图中使用指向 S3 URL 的 iframe。
    2. 向亚马逊 URL 发出服务器端请求,并将响应呈现为您的 Rails 视图之一。

    第一个选项非常简单。如果您的条件得到满足,您将打开一个具有嵌入式 iframe 的 rails 视图,其 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 你想输出字符串,不进行任何编码以使其成为html 安全。

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

    P.S:我还想知道,也可以通过 URL 重写或使用 .htaccess 或类似方法的代理传递来做到这一点,但在您的问题中,您特别询问了“Rails”。

    【讨论】:

    • 嗨 Tanzeel,感谢您的详细回复...不过我有一些担忧.. 1> iframe 的滚动条内是否会有丑陋的滚动条? 2> 我喜欢从服务器负载角度做 iframe 的架构(假设我每天有 100 万个请求),但可用性和用户体验是主要问题,我相信你提到的 ajax hack 不是实时的,对吧? (即有滞后?)从用户体验的角度来看,您的第二个解决方案似乎更好,但从服务器负载的角度来看可能没有那么好......下面的更多内容......
    • Solution 2> 我非常喜欢这个,但我对成本有点敏感.. 你估计我可能需要在 Heroku 之类的东西上消耗多少 Heroku dyno .. 每个额外的 dyno 大约需要 15 美元每月。例如,我的目标是每天 100 万次的稳定流量处理能力。
    • 我也对 URL 重写或代理传递方法很好奇,但使用 Puma 或 Unicorn 或 Thin 等机架兼容服务器。也许我会在 StackOverflow 上针对这个问题开始另一个问题......但我需要更具描述性(从功能的角度来看,不知道 URL 重写或代理传递是什么)
    • @sambehera 从您的 cmets 来看,我认为 iframe 方法对成本和负载更加敏感(它将直接针对 iframe 内容访问亚马逊服务器)。至于滚动条上的问题,如果你这样做正确,你将不会得到双滚动条。寻找与调整元素大小以适应窗口视口/屏幕相关的答案。做 iframes 是在 HTML 上付出更多的努力,而 JS 是用来调整框架大小的。
    • @sambehera 而不是我试图解释在 cmets 中的 URL 重写和代理传递,我认为您可以在 SO 上找到一些更好的答案(或谷歌他们)。 ;)
    猜你喜欢
    • 2011-11-19
    • 2021-09-23
    • 2011-06-19
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多