Rails:将所有未知路由重定向到 root_url

Posted

技术标签:

【中文标题】Rails:将所有未知路由重定向到 root_url【英文标题】:Rails: redirect all unknown routes to root_url 【发布时间】:2011-05-07 03:10:07 【问题描述】:

每当用户点击错误的页面时,rails 都会显示公用文件夹中的 404.html。但是,我只想将浏览器重定向到根页面,而不显示任何内容。所以我尝试了globbing,但无济于事,它仍然显示404页面。这是我的路线文件的摘录:

# ...
map.root :controller => 'home', :action => 'home'
map.connect '*', :controller => 'home', :action => 'home'

有什么建议吗?谢谢各位!

【问题讨论】:

我假设你有一个 'home_controller',其中包含 'home' 动作,它表示类似 render :nothing => true? 没有。 home 控制器中有一个 home 动作,还有一个 home 视图(home.html.erb)。 【参考方案1】:

如果您的项目由 rails 3 提供支持,只需将此行添加到您的 routes.rb

match '*path' => redirect('/')

编辑:如果您使用的是 Rails 4 或 5

match '*path' => redirect('/'), via: :get

get '*path' => redirect('/')

【讨论】:

谢谢!好吧,它是 Rails 2.3.10 非常感谢很多,伙计!它做到了。这就是我在 Rails 2 中的做法:map.connect '*path', :controller => 'home', :action => 'home' 所以,'*path' 是整个事情的关键。再次感谢:-) 你也可以用get代替match,这只是添加via: :get的简写。 确保将其放在路线列表的底部。 那是因为路由匹配,这就是路由器所关心的。您需要在控制器中进行额外检查,以查看具有所提供 ID 的文章是否存在。【参考方案2】:

喜欢 Arkan 的回答。有一点,如果不希望在开发环境中出现这种行为,那么可以这样做 -

match '*path' => redirect('/')   unless Rails.env.development?

【讨论】:

【参考方案3】:

导轨 4-

(routes.rb)

您仍然可以使用简单的get 重定向所有未知路由。

  get '*path', to: 'home#index'

如果您希望为 POST 和 GET 请求提供路由,您仍然可以使用 match,但 Rails 希望您通过 via 指定请求方法。

  match "*path" => "home#index", via: [:get, :post]  

请记住,routes.rb 是按顺序执行的(匹配符合所提供路径结构的第一个路由),因此请将通配符捕获放在匹配的底部。

【讨论】:

谢谢你把它放在底部的通知。 这还能用吗?在我的 Rails 4 应用程序中似乎不起作用。 我在 Rails 5 中遇到问题,get '*path', to: 'searches#new' 导致我的应用中所有上传的图像出现 406 错误。【参考方案4】:

rails 5.2 中似乎存在一个错误,其中 active_storage 路由被包罗万象的路由拾取,导致上传图像的链接断开。该问题已在 github 上的 rails repo 中报告,并且有人对以下补丁进行了评论,直到该错误在新版本中得到修复:

routes.rb 之前end

get '*all', to: 'application#index', constraints: lambda  |req|
    req.path.exclude? 'rails/active_storage'
  

然后在应用控制器中添加:

def index
  flash.notice = 'No page found at that address'
  redirect_to root_path
end

【讨论】:

另外,您可以在应用程序初始化后添加 catch-all 路由,如下所述:github.com/rails/rails/issues/671#issuecomment-1780159 这个答案是在 Rails 6 中使用 ActiveStorage 的方法【参考方案5】:

你需要创建一个控制器来做到这一点

class RedirectsController 

  def index
    redirect_to root_url
  end
end

在你的路线中

map.connect '*', :controller => 'redirects', :action => 'index'

【讨论】:

这也是 Rails 3 的答案吗? 也适用于 rails 3。你只需要用火柴改变线。请参阅路由指南中的 globing

以上是关于Rails:将所有未知路由重定向到 root_url的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 4 中将一个路由重定向到 HTTPS,将所有其他路由重定向到 HTTP?

如果未登录,如何将用户重定向到登录页面

Symfony 3 将所有路由重定向到当前语言环境版本

可以在 Rails 中创建此重定向路线吗?

如何将所有路由重定向到nest.js中的index.html(Angular)?

重定向 PATCH 和 PUT 路由轨道 5 以使用 POST