直接使用Rack TryStatic提供文件?

时间:2012-08-06 18:31:37

标签: ruby heroku rack middleman

我正在使用Middleman创建静态网站。

Middleman在./build目录中生成静态html文件。

这是我目前正在使用的配置:

require 'rubygems'
require 'middleman'
require 'rack/contrib/try_static'

use Rack::TryStatic, :root => "build", :urls => %w[/], :try => ['.html']

run Middleman::Application.server

所以Middleman正在提供静态文件。如何让Rack::TryStatic直接处理请求?

我试图让它像

run Rack::TryStatic, :root => "build", :urls => %w[/], :try => ['.html']

但它不起作用运行只接受1个参数。 Rack::TryStatic需要2个参数appoptions进行初始化,而我没有任何app

我该怎么做?

(如果重要的话,我正在部署到Heroku)

1 个答案:

答案 0 :(得分:3)

正如您所注意到的,像Rack::TryStatic这样的Rack中间件组件需要另一个应用程序来传递请求。您可以创建一个简单的用户,例如刚刚返回404响应,例如:

app = lambda {|env| [404, {'Content-type' => 'text/plain'}, ['Not found']
run Rack::TryStatic.new app, :root => "build", :urls => %w[/], :try => ['.html']

或等效地:

use Rack::TryStatic, :root => "build", :urls => %w[/], :try => ['.html']
run lambda {|env| [404, {'Content-type' => 'text/plain'}, ['Not found']]}

如果你有自己的404文件,你可以使用rack-contrib的Rack::NotFound而不是你自己的自定义终点:

use Rack::TryStatic, :root => "build", :urls => %w[/], :try => ['.html']
run Rack::NotFound.new('path/to/your/404.html')

如果您没有使用:try文件扩展名数组来尝试投放,则可以直接使用Rack::File。在内部,Rack::TryStatic使用Rack::Static,后者又使用Rack::File。与TryStaticStatic不同,Rack::File本身就是一个Rack应用程序,因此不需要单独的应用程序来传递请求。您的config.ru就是:

run Rack::File.new './build'

虽然这不允许“裸”请求与相应的.html文件一起提供 - 但所有请求都需要指定整个文件名。