【问题标题】:How to remove '/' from end of Sinatra routes如何从 Sinatra 路由的末尾删除“/”
【发布时间】:2020-07-14 16:24:51
【问题描述】:

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

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

get '/tickets/' do

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

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

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

我的路线设置为

get '/tickets' do

【问题讨论】:

标签: ruby routes sinatra


【解决方案1】:

这个问题实际上比乍看之下要大。遵循“How do I make the trailing slash optional?”中的建议确实可以解决问题,但是:

  • 它要求您修改所有现有路线,并且
  • 它会产生“重复内容”问题,即从多个 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)会造成无限循环,所以你绝对不想这样做。

【讨论】:

    【解决方案2】:

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

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

    set :strict_paths, false
    

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

    【讨论】:

      猜你喜欢
      • 2016-04-13
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多