2012-08-06 64 views
4

我正在使用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的)

回答

3

正如你已經注意到,一個機架中間件組件如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文件送達的「裸」的要求 - 所有請求都需要指定整個文件名。