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

13
您可以通过将静态文件放置在public/目录下(默认情况下)来使用Sinatra提供静态文件服务。我当前在那里有一个index.html文件,但是如何使根路径指向该文件而不必将其解析为模板呢?
明确一下,我可以成功访问/index.html,我想路由/到相同的静态文件,但是不进行重定向。有没有任何想法如何实现?
6个回答

20

也许会有更好的答案,但在那之前我来试着回答一下。

如果这不是你想要的:

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

你可以像这样做:

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

不过我会选择第一个,不确定为什么你想避免那个重定向


投票支持第一个解决方案。如果您使用Passenger,这个方法可以直接使用,无需路由或重定向。 - rubiii
1
@rubii 我认为把乘客路线放在自己的答案中会更有价值。这似乎比我的答案更正确。 - Pablo Fernandez
我认为你的回答完全没问题。我敢打赌JP没有使用Passenger,但我会为其他人发布一个答案。 - rubiii
我并不是真的需要避免重定向,我只是喜欢“干净”的URL :) (/ 而不是 /index.html/help 而不是 /help.html) -- 不过没关系,重定向似乎是最好的选择,谢谢! - JP.

6
只需在您的应用程序类内设置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

4

3
使用 passenger 看起来可以直接使用。只需在 public 目录中放置 index.html 文件且没有路由配置,访问根 URL 时会显示 index.html。

3

链接无法找到。 - aandis

3
我认为这只是一个问题,因为Sinatra/Rack没有默认文件的概念来提供服务,如果你只访问/。在像Apache或Nginx这样的Web服务器中,这已经为您处理好了,并且通常默认为index.html index.htm(如果两者都存在,则在访问没有实际文件名的目录时将被提供)。
当每个人都说这是内置到Passenger中时,我认为他们真正意思是它内置到了Apache/Nginx中。Apache/Nginx将检查静态文件是否存在,如果存在则提供服务,请求将永远不会到达Rack,这对性能非常有利。
我不想设置重定向到404页面,因为这有点违反了HTTP的整个理念:应该有一个端点来处理所有内容,该端点应返回该端点的真实状态。这意味着如果你访问/asdf,你希望Web服务器报告404,因为实际上就是这种情况。如果你进行重定向,现在你的网站正在说“我曾经在这里有东西,但它已经移动了”,然后它重定向你到的页面,即使页面上的文本显示404,实际上仍由Web服务器报告为200,这意味着“这个页面一切正常!”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接