Обслуживать файлы с помощью 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
файл - во всех запросах должно быть указано полное имя файла.