2013-01-22 43 views
0

我有一個基本應用程序,用戶可以在其中上傳一堆HTML文件(index.html,mypage.html)和一堆資產(myimage.jpg,myscript.js),並訪問他們自己的網址,如www.mysite.com/username/index.html。從動態內容中爲Cloudfront提供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應用程序返回一個空的HTML頁面JS
  2. 的JS加載從的Cloudfront HTML文件(利用緩存)
  3. JS注入的HTML頁面上,與註釋,書籤一起等

我認爲這將是偉大的,但我卡上的文件版本。爲了利用緩存,我想設置很長的TTL並利用文件驗證。但是,我不想運行所有用戶上傳的HTML並將/myimage.jpg中的所有資產標記替換爲/myimage-VERSION.jpg,而且我不想要像www.mysite.com/這樣的漫長網址。用戶名/索引-VERSION.html

我想知道是否有聰明的方法來做到這一點?基本上從Cloudfront獲取HTML,從我的Rails應用程序注入HTML,並利用版本化文件,同時保持良好的URL和原始HTML文件不變。

或者我寧願去在控制器端使用memcached?

任何想法?

回答

1

您可以將CloudFront設置爲使用您的Rails應用程序作爲custom origin。首先向CloudFront發送請求。當一個新的未緩存的請求進入CloudFront時,您的應用將首先觸發CloudFront的緩存。在將完成的頁面交付給CloudFront進行緩存之前,您可以執行所有自定義處理。設置適當的緩存ETag或類似的,CloudFront將向您請求更新,您可以爲其提供304或新內容。

+0

謝謝。我決定在控制器中使用memcached,但這是一個很好的下一步。 – Ronze