Обслуживать файлы с помощью 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

Таким образом, Middleman обслуживает статические файлы прямо сейчас. Как я могу сделать Rack::TryStatic обрабатывать запросы напрямую?

Я пытался сделать что-то вроде

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

Но это не работает, запуск только принимает 1 аргумент. А также Rack::TryStatic требует 2 аргументов, app а также options инициализировать, а у меня нет app,

Как я могу это сделать?

(И если это имеет значение, я развертываю на Heroku)

1 ответ

Решение

Как вы заметили, компонент промежуточного ПО 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::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, В отличие от TryStatic а также Static, Rack::File это приложение Rack само по себе, и поэтому не требует отдельного приложения для передачи запросов. Ваш config.ru тогда будет просто:

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

хотя это не позволило бы обслуживать "голые" запросы с соответствующими .html файл - во всех запросах должно быть указано полное имя файла.

Другие вопросы по тегам