Sinatra静态资产空无一人

时间:2013-04-23 10:43:23

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

config/environments/production.rb

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

答案 1 :(得分: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