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?