在动态内容中提供Cloudfront中的HTML和资源

时间:2013-01-22 21:34:44

标签: javascript ruby-on-rails cdn amazon-cloudfront

我有一个基本的应用程序,用户可以上传一堆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加载内容。
  3. 我想要的是以下

    1. Rails应用程序返回带有JS
    2. 的裸HTMl页面
    3. JS从Cloudfront加载HTML文件(利用缓存)
    4. JS在页面上注入HTML,以及注释,书签等
    5. 我认为这会很棒,但我坚持使用文件版本。为了利用缓存,我想设置长TTL并利用文件验证。但是,我不想浏览所有用户上传的HTML并将所有资产标签从/myimage.jpg替换为/myimage-VERSION.jpg,我不想要像www.mysite.com/这样长的疯狂网址用户名/索引VERSION.html

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

      或者我应该在控制器端使用memcached?

      有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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