Маршрутизация статической страницы в Sinatra (Ruby)
Вы можете обслуживать статические файлы с помощью Sinatra, поместив их в public/
(по умолчанию). В настоящее время у меня есть index.html
, но как я могу сделать корневую точку для этого файла без необходимости синтаксического анализа это как шаблон?
Чтобы быть ясным, я могу успешно получить доступ к /index.html
, и я бы хотел, чтобы маршрут /
был тем же статическим файлом, но без перенаправления. Любая идея, как это сделать?
Ответы
Ответ 1
Вероятно, лучший ответ в конечном итоге наступит, пока это не будет моим выстрелом.
Если это не то, что вы хотите:
get '/' do
redirect '/index.html'
end
Вы можете сделать что-то вроде этого:
get '/' do
File.new('public/index.html').readlines
end
Я бы пошел с первым, хотя, не уверен, почему вы хотите избежать перенаправления
Ответ 2
Просто установите enable :static
внутри вашего класса приложения. Например:
class App < Sinatra::Base
# Set the app root; this is where the 'public' and 'views'
# directories are found (by default).
set :root, File.expand_path("#{File.dirname(__FILE__)}/../app")
# Allow the app to serve static files from the 'public' directory in :root
enable :static
end
Ответ 3
require 'sinatra'
get '/' do
send_file File.join(settings.public_folder, 'index.html')
end
Как описано в Обслуживание статических файлов с помощью Sinatra
Ответ 4
используя пассажир, это, кажется, работает прямо из коробки. имеющий файл index.html в общедоступном каталоге, и никакая маршрутизация не вызывает index.html при доступе к корневому URL.
Ответ 5
Я думаю, что это только проблема, потому что у Sinatra/Rack нет концепции файла по умолчанию для обслуживания, если вы просто переходите к /
. В веб-сервере, таком как Apache или Nginx, об этом заботятся и обычно по умолчанию используется index.html index.htm
(если он существует, он будет обслуживаться при переходе в каталог без фактического имени файла в конце).
Когда все говорят, что это встроено в Passenger, я думаю, что они действительно означают, что он встроен в Apache/Nginx. Apache/Nginx будет проверять, существует ли статический файл и обслуживать его, если запрос не будет доставлен на стойку, что является потрясающим для производительности.
Я бы не хотел настраивать перенаправление на страницу 404, так как этот тип нарушает всю идею HTTP: должна быть одна конечная точка для всего, что конечная точка должна вернуть истинное состояние этой конечной точки. Это означает, что если вы перейдете к /asdf
, вы хотите, чтобы веб-сервер сообщал 404, потому что это то, что на самом деле происходит. Если вы делаете переадресацию, теперь ваш сайт говорит: "У меня было что-то здесь, но оно перемещалось", а затем перенаправляемая вами страница, даже если она говорит 404 в тексте на странице, фактически сообщается в Интернете сервер как 200, то есть "все хорошо с этой страницей!"
Ответ 6
Для решения этой проблемы существует драгоценный камень "sinatra-index".
https://github.com/elitheeli/sinatra-index