0

我有一个基本的应用程序,用户可以在其中上传一堆 HTML 文件(index.html、mypage.html)和一堆资产(myimage.jpg、myscript.js),并通过他们自己的网址(如 www.mysite)访问这些文件。 com/用户名/index.html。

但是,我的网站在上传的 HTML 中添加了一堆东西:添加评论、书签等的能力。所有这些都是通过 JS 注入的。

在我的 Rails 应用程序中,现在我正在控制器中加载用户从 S3 上传的内容,并将其与一堆 JS 一起输出到我的视图中:

def show
   # load HTML from S3
   # strip out everything between body tags and put in @body var
   # render view that outputs @body on a page with a bunch of JS
end

但是,这非常慢,因为:

  1. 我没有为用户上传的文件利用 CDN 缓存
  2. 我没有在客户端上放置任何 HTTP 调用。客户端在查看任何内容之前正在等待服务器从 S3 加载内容。

我想请求的是以下内容

  1. Rails 应用程序返回一个带有 JS 的裸 HTMl 页面
  2. JS 从 Cloudfront 加载 HTML 文件(利用缓存)
  3. JS 在页面上注入 HTML,以及评论、书签等

我认为这会很棒,但我坚持文件版本控制。为了利用缓存,我想设置长 TTL 并利用文件验证。但是,我不想遍历所有用户上传的 HTML 并将所有资产标签从 /myimage.jpg 替换为 /myimage-VERSION.jpg,并且我不想要像 www.mysite.com/ 这样长的疯狂 URL用户名/索引-VERSION.html

我想知道是否有聪明的方法来做到这一点?基本上是从 Cloudfront 获取 HTML,从我的 Rails 应用程序中注入 HTML,并利用版本化文件,同时保持漂亮的 URL 和原始 HTML 文件不变。

还是我应该在控制器端使用 memcached?

有任何想法吗?

4

1 回答 1

1

您可以设置 CloudFront 以使用您的 Rails 应用程序作为自定义源。首先向 CloudFront 发送请求。当一个新的、未缓存的请求进入 CloudFront 时,您的应用程序将首先被命中以准备 CloudFront 的缓存。这是您在将完成的页面交付给 CloudFront 进行缓存之前执行所有自定义处理的时间。设置适当的缓存 ETag 或类似内容,CloudFront 将向您请求更新,您可以为其提供 304 或新内容。

于 2013-01-23T01:18:02.070 回答