如何从 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
,因此您无需将 /?
添加到所有路径
我正在使用 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
,因此您无需将 /?
添加到所有路径