【问题标题】:Sinatra static assets emptySinatra 静态资产为空
【发布时间】:2013-04-23 10:43:22
【问题描述】:

我在 Rails 应用程序中有一个 Sinatra 应用程序,它提供目录中的静态资产。该应用程序安装在 Rails 路线中,如下所示:

mount BeanstalkdView::Server, :at => "/beanstalk"

当我在本地运行它时,它使用 Thin 运行良好,但是当我在我的测试服务器(Nginx/Passenger)上运行它时,静态资产表现得很奇怪。对静态文件的请求返回 200 OK,但没有内容。

我通过set :public_folder, "#{root}/resources" 告诉 Sinatra 我的静态文件在哪里,并在模板中加载静态文件,例如带有#{request.env['SCRIPT_NAME']}/css/file.css 的 CSS 文件。我验证了两条路径都是正确的。

【问题讨论】:

  • 当你打开开发者工具时,你有没有在net选项卡中看到任何错误?
  • 否,状态为 200 OK。

标签: ruby-on-rails sinatra assets rails-routing


【解决方案1】:

这是由于 ::Rack::Sendfile 中间件在生产中的 Rails 3.0.x 中默认启用(在自 3.1.x 以来的任何环境中默认禁用)。

这个中间件非常简单但功能强大。当您传递响应:path::Rack::File::Sinatra::StaticFile(或任何其他对象)时,此中间件添加X-SendFile(对于Apache)或X-SendFile-Redirect(对于NGinx)并且不发送实际的正文。这样 Apache 或 NGinx 将处理真正的文件传递。这是在生产中提供静态资产的一种很好且最有效的方式,但是您可以禁用此中间件(如果您不想弄乱您的 Nginx/Apache 配置)。在您的 config/environments/production.rb 文件中查找并评论以下配置选项:

config.action_dispatch.x_sendfile_header

此配置选项用于指示Sendfile 中间件设置哪个标头(如果未指定,则不执行任何操作)。

【讨论】:

    【解决方案2】:

    Aleksey V 的回答对我帮助很大。最后,我在production.rb 中使用 Nginx 的正确设置解决了这个问题:

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

    确保重新启动 Rails 应用程序、Nginx 并在浏览器中进行硬刷新以获取文件。

    欲了解更多信息,请查看:http://jimneath.org/2011/04/05/rails-3-nginx-and-send_file.html

    【讨论】:

      猜你喜欢
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 2017-01-04
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多