直接使用Rack TryStatic服务文件?

问题描述:

我正在使用Middleman创建一个静态网站。直接使用Rack TryStatic服务文件?

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

这里是我目前使用的配置:

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

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

run Middleman::Application.server 

所以中间人是正确的,现在服务于静态文件。我如何才能让Rack::TryStatic直接处理请求?

我试图使它像

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

的东西,但是它不运行工作,只接受1级的说法。而Rack::TryStatic需要2个参数,appoptions来初始化,而我没有任何app

我该怎么做?

(如果它很重要,我部署到Heroku的)

正如你已经注意到,一个机架中间件组件如Rack::TryStatic需要另一个应用程序传递请求到。你可以创建一个简单的来使用,例如只需返回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文件,你可以使用机架的contrib的Rack::NotFound,而不是你自己的自定义的终点:

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

如果你不使用:try阵列的文件扩展名的尝试和服务,你不需经过d直接使用Rack::File。在内部,Rack::TryStatic使用Rack::Static,后者又使用Rack::File。与TryStaticStatic不同,Rack::File本身就是一个Rack应用程序,因此不需要单独的应用程序来传递请求。然后你config.ru,简直是:

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

虽然这不会允许与相应.html文件送达的“裸”的要求 - 所有请求都需要指定整个文件名。