【问题标题】:Serving HTML and assets from Cloudfront among dynamic content在动态内容中提供来自 Cloudfront 的 HTML 和资产
【发布时间】:2013-01-06 06:22:20
【问题描述】:

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

但是,我的网站在上传的 HTML 中添加了一堆东西:添加 cmets、书签等的能力。所有这些都是通过 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,以及 cmets、书签等

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

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

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

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我决定只在控制器中使用 memcached,但这是一个很好的下一步。
    猜你喜欢
    • 2014-08-04
    • 2016-05-22
    • 2017-07-13
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多