0

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

4

1 回答 1

2

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

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

第一个选项非常简单。如果您的条件得到满足,您将打开一个具有嵌入式 iframe 的 rails 视图,其src属性指向 S3 URL。您将不得不在 JS 中动态处理 iframe 尺寸(宽度 x 高度),以便为用户提供无缝体验(窗口调整大小等)。

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

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

在您看来,您需要渲染url_response

<%= url_response.html_safe %>

使用html_safe你告诉rails你想输出字符串,没有任何编码,以使其安全。

使用这些选项中的任何一个都会使请求看起来好像来自您的服务器。

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

于 2013-01-08T02:44:21.227 回答