Heroku + Rails4.2:云端设置

Heroku + Rails4.2 : Cloudfront setup

我正在尝试为我的 heroku 应用程序设置 Cloudfront。 The documentation好像缺乏独立性

以下是我遵循的步骤:

 1. Setup Cloudfront in AWS console
 2. Added cloudfront domain name to production.rb `config.action_controller.asset_host = 'XXXX.cloudfront.net'`
 3. Set `config.assets.compile = true` in production.rb
 4. Verified AWS_SECRET_ACCESS_KEY is correct in heroku config
 5. I have added `gem 'rails_12factor', group: :production`

None 的资产加载了。我在设置中遗漏了任何步骤吗?


更新 1:

在 chrome 调试器中,从这个 url 的云端正确请求资产:http://XXXXX.cloudfront.net/assets/application-22c7c249df1a24541d86603b0715eefe.css

然而在请求头中看到一个Status Code:302 Moved Temporarily。我想知道我是否有重定向循环以及如何调试它。

更新2

感谢大家的建议。更多信息:

  1. 当我尝试从我的应用程序下载资产时,我在浏览器上重定向到主页,但使用 curl 我能够获取资产。例如:curl 'http: //www.myapp.com/assets/application-c9a778bb55ad4152d956fd34fe6f7839.css'
  2. 该应用程序不使用 SSL。但是我仍然根据@Omar 的建议将 Origin Protocol Policy 设置为 Match Viewer
  3. 我尝试在浏览器上从我的应用程序下载资产并且能够访问资产。例如:'http: //www.myapp.com/assets/application-c9a778bb55ad4152d956fd34fe6f7839.css' 但是,尝试直接在云端访问资产 (d1ax5oefcdtdki.cloudfront.net/assets/application-c9a778bb55ad4152d956fd34fe6f7839.css) 会将其重定向到 myapp.com
  4. cloudfront DS 的屏幕截图:

https://www.dropbox.com/s/bkg480d4it6zl2r/Screenshot%202015-12-06%2014.01.28.png?dl=0

http://glui.me/?i=7ah73hffrhvmpt7/2015-12-06_at_2.02_PM.png/

https://www.dropbox.com/s/dd4wwgm3md8w7qn/Screenshot%202015-12-06%2014.05.20.png?dl=0

当您第一次请求资产时,cloudfront 会检查文件是否已缓存,例如您请求:

http://XXXXX.cloudfront.net/assets/application-22c7c249df1a24541d86603b0715eefe.css

cloudfront 第一次会出现缓存未命中,然后它将从 rails 的等效路径中提取文件。这样下次你请求同一个文件时,它就已经被缓存了。

为了使其正常工作,您需要确保所有设置都正确无误。

从 rails 方面除了在 production.rb 中设置 assets_host 之外没有什么可做的。由于您已经拥有 rails_12factor gem,因此无需添加 config.assets.compile = true。从 gem 的文档中,您可以在“如何”部分看到它添加服务静态资产 "the documentation"

从我认为您面临问题的 cloudfronts 方面,您需要设置一些设置,让 cloudfront 知道它如何在缓存未命中时与您的 rails 应用程序通信。在云端设置中,您需要检查

Origin Domain Name 成为您 rails 应用的 url。

Origin Protocol PolicyMatch Viewer

Distribution StateEnabled

还有一些其他设置可以帮助您优化内容交付缓存。

对于在调试云端时遇到问题的任何其他人。

问题是 Cloudfront 缓存了重定向(可能是设置错误)。使缓存无效后,我能够强制 CF 从我的应用程序中获取资产并为它们提供服务。