2013-04-23 108 views
0

我有一个Rails应用程序中的Sinatra应用程序,它提供一个目录中的静态资源。该应用程序被安装在滑轨的路线是这样的:Sinatra静态资产空

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

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

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

+0

当您打开开发人员工具时,是否在网络选项卡中收到任何错误? – Simpleton 2013-04-23 11:00:44

+0

不,状态是200 OK。 – TTT 2013-04-23 11:04:37

回答

2

阿列克谢V的回答帮了我很多。最后,我解决了这个使用Nginx的正确的设置在production.rb

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

确保重新启动您的Rails应用程序,Nginx的,做在你的浏览器硬刷新需要的档案。

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

3

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

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

config.action_dispatch.x_sendfile_header 

该配置选项用于指示Sendfile中间件要设置的头(如果没有指定,没有做任何事情)。