4

我正在使用 Middleman 创建一个静态站点。

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

所以 Middleman 现在正在提供静态文件。我怎样才能Rack::TryStatic直接处理请求?

我试着让它像

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

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

我怎样才能做到这一点?

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

4

1 回答 1

3

正如你所注意到的,一个 Rack 中间件组件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 文件,则可以使用 rack-contribRack::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. 与TryStaticand不同StaticRack::File它本身就是一个 Rack 应用程序,因此不需要单独的应用程序来传递请求。那么您config.ru将只是:

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

尽管这不允许使用相应的.html文件来处理“裸”请求——所有请求都需要指定整个文件名。

于 2012-08-07T05:17:17.130 回答