【问题标题】:Rails 3.1 + Heroku Cedar - Static image assets are not being servedRails 3.1 + Heroku Cedar - 未提供静态图像资产
【发布时间】:2011-09-21 11:37:18
【问题描述】:

我在 Heroku Cedar 上部署了一个 Rails 3.1 应用程序。由于某种原因,我的静态图片资源没有被提供:

2011-06-23T18:14:13+00:00 app[web.1]: Started GET "/assets/me_reminder-30f9d1dead32e12238888adbee4b92d3.png" for 98.207.60.248 at 2011-06-23 18:14:13 +0000
2011-06-23T18:14:13+00:00 app[web.1]: Served asset /me_reminder-30f9d1dead32e12238888adbee4b92d3.png - 200 OK (0ms) (pid 1)
2011-06-23T18:14:13+00:00 app[web.1]: cache: [GET /assets/me_reminder-30f9d1dead32e12238888adbee4b92d3.png] miss, store
2011-06-23T18:14:13+00:00 heroku[router]: GET xxxx.herokuapp.com/assets/me_reminder-30f9d1dead32e12238888adbee4b92d3.png dyno=web.1 queue=0 wait=0ms service=35ms status=200 bytes=0

如您所见,它返回的内容为 0 字节。不用说,没有图像显示。

但是,我的所有其他静态资产(css、javascripts)都得到了正确的服务。知道这里可能出了什么问题吗?

顺便说一句,我在 heroku 上有另一个 Rails 3.1 应用程序,它工作得很好,所以我不认为这是链轮等问题。

谢谢。

【问题讨论】:

    标签: ruby-on-rails heroku


    【解决方案1】:

    我遇到了同样的问题。在config/environments/production.rb 文件中,评论:

    config.action_dispatch.x_sendfile_header = "X-Sendfile"
    

    相反,有:

    config.action_dispatch.x_sendfile_header = nil # For Heroku
    

    这也是推荐的方法。正如Heroku docs 中所建议的那样。

    为我工作。

    【讨论】:

    • 谢谢,这让我发疯了。您链接到的文档没有提及此更改,但显然应该提及。
    • 这很奇怪。他们一定重写了文档。上次我检查时,它就在那里……确实很奇怪。很高兴它帮助了你
    • 在我的 Rails 2 实例中为我工作。我很想知道为什么。
    【解决方案2】:

    我遇到了同样的问题。将 production.rb 文件配置更改为

    config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
    

    来自

    config.action_dispatch.x_sendfile_header = "X-Sendfile"
    

    为我工作。因为 Heroku 在前面使用了 nginx。

    【讨论】:

    • 谢谢,我刚刚遇到了同样的问题,这为我解决了。
    • 这对我也有用,在 Heroku 的 3.1 文档中绝对没有提到它
    • 这可能并不总是有效:请参阅Heroku docs on Rack::Sendfile
    • Heroku 在 cedar 应用程序前没有 NGINX。
    • @Schneems 那是错误的。 Cedar 使用 nginx,但它与 Rails 应用程序不在同一台服务器上。这就是为什么 X-Accel-Redirect 不能在 Heroku 上可靠使用的原因。
    【解决方案3】:

    我遇到了这个问题,因为我使用 HTML 引用资产管道中的图像。示例:

    <img src="/assets/hello.jpg" />
    

    图片资源可以在本地工作,但不能在 Heroku 上工作。切换到使用 Rails 的 image_tag 视图助手解决了这个问题。示例:

    <%= image_tag "hello.jpg" %>
    

    【讨论】:

    • 你会如何用 CSS 来做呢? :D
    • @DeG 我的确切问题。
    【解决方案4】:

    如果我没记错的话,在资产管道中使用图像可能会出现一些意外行为。为避免这种情况,您可以将它们保留在 public/ 中,就像以前版本的 rails 一样。

    查看讨论here

    【讨论】:

    • 嗯,我的其他应用程序没有公共/图像中的图像,一切正常。我试图将所有内容复制到公开中,但这并没有解决问题。
    • 说实话,我对这个问题的性质真的不是很熟悉,因为我自己从来没有遇到过。促使我向您指出该讨论的原因是您的问题发生在 Heroku 上,该应用程序(我假设)在生产模式下运行。我向您指出的问题专门涉及在切换到生产模式时无法通过资产管道正确(或至少按预期)提供静态图像资产。
    • 当然,我明白了,谢谢。而且讨论是最近才开始的,所以我很乐观它会解决我的问题 :) 事实证明它没有。
    • 和我一样。当您将图像移动到public/ 时,您是否确保您的 URL 辅助方法正确?
    • 是的,它在本地工作,我确保将它们放在正确的位置。无论如何,我找到了this discussion,它描述了我遇到的确切问题。出于某种原因,即使将缓存设置为 false 也无法为我解决问题。此外,我不知道为什么它适用于我的其他应用程序,除了一些不相关的宝石(例如设计)之外,它具有几乎相同的配置。它也在heroku上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2011-10-04
    • 1970-01-01
    • 2017-01-14
    相关资源
    最近更新 更多