Sinatra中的静态页面路由(Ruby)

您可以通过将它们置于public/ (默认情况下)来为Sinatra提供静态文件 – 我目前在那里有一个index.html ,但是如何将根指向该文件而不必将其解析为模板?

为了清楚/index.html ,我可以成功访问/index.html ,并且我想路由/成为相同的静态文件,但没有重定向。 知道怎么做吗?

可能会有一个更好的答案最终会出现,直到那时这才是我的目标。

如果这不是你想要的:

 get '/' do redirect '/index.html' end 

你可能会这样做:

 get '/' do File.new('public/index.html').readlines end 

我会选择第一个,但不确定为什么要避免重定向

只需在app类中设置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 
 require 'sinatra' get '/' do send_file File.join(settings.public_folder, 'index.html') end 

如在使用Sinatra提供静态文件中所述

使用乘客这似乎开箱即用。 在公共目录中有一个index.html文件,并且在访问根URL时没有路由引出index.html。

我认为这只是一个问题,因为如果你去/ Sinatra / Rack没有默认文件的概念。 在像Apache或Nginx这样的网络服务器中,这将由你负责,并且通常默认为index.html index.htm (如果存在,它将在转到最终没有实际文件名的目录时获得服务)。

当每个人都说这是内置于Passenger时,我认为它们的确意味着它内置于Apache / Nginx中。 Apache / Nginx将检查静态文件是否存在并提供服务,如果确实如此,请求将永远不会到达Rack,这对于性能来说非常棒。

我不想设置重定向到404页面,因为这违反了HTTP的整个想法:对于终点应该返回该端点的真实状态的所有内容应该有一个端点。 这意味着如果你去/asdf希望网络服务器报告404,因为这是实际发生的事情。 如果你进行重定向,现在你的网站说“我以前在这里有东西,但它移动了”然后它重定向你的页面,即使它在页面上的文本中显示404,实际上是由网络报告的服务器为200,意思是“这个页面的一切都很好!”

有一个gem“sinatra-index”来解决这个问题。

https://github.com/elitheeli/sinatra-index