直接使用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个参数,app
和options
来初始化,而我没有任何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
。与TryStatic
和Static
不同,Rack::File
本身就是一个Rack应用程序,因此不需要单独的应用程序来传递请求。然后你config.ru
,简直是:
run Rack::File.new './build'
虽然这不会允许与相应.html
文件送达的“裸”的要求 - 所有请求都需要指定整个文件名。