如何从 Sinatra 路由的末尾删除“/”

How to remove '/' from end of Sinatra routes

我正在使用 Sinatra 和 shotgun 服务器。

当我输入 http://localhost:9393/tickets 时,我的页面按预期加载。但是,在末尾有一个额外的“/”,Sinatra 建议我添加

get '/tickets/' do

如何让服务器在不创建额外路由的情况下接受额外的“/”?

Sinatra 的“How do I make the trailing slash optional?”部分中的信息看起来很有用,但这意味着我需要将这段代码添加到每个路由中。

是否有更简单或更标准的方法来做到这一点?

我的路线设置为

get '/tickets' do

这个问题实际上比乍一看要大。按照“How do I make the trailing slash optional?”中的建议确实解决了问题,但是:

  • 它要求您修改所有现有路由,并且
  • 它会产生一个 "duplicate content" 问题,其中相同的内容由多个 URL 提供。

这两个问题都可以解决,但我认为更简洁的解决方案是为所有以 / 结尾的非根 URL 创建重定向。这可以通过将 Sinatra's before filter 添加到现有的应用程序控制器中轻松完成:

before '/*/' do
  redirect request.path_info.chomp('/')
end

get '/tickets' do
  …
end

在那之后,您现有的 /tickets 路由将像以前一样工作,但现在所有对 /tickets/ 的请求将在正常处理之前重定向到 /tickets

因此,应用程序将响应 /ticket/tickets/ 端点,而无需更改任何现有路由。

PS: 重定向根 URL(例如:http://localhost:9393/http://localhost:9393)将创建一个无限循环,所以你绝对不想那样做。

FAQ 似乎没有提及 2017 年添加的选项 (https://github.com/sinatra/sinatra/pull/1273/commits/2445a4994468aabe627f106341af79bfff24451e)

把它放在你定义路由的同一范围内:

set :strict_paths, false

这样,Sinatra 会将 /tickets/ 视为 /tickets,因此您无需将 /? 添加到所有路径