如何在我的routes.rb中为此URL结构编写重定向规则?

时间:2014-09-04 08:28:50

标签: ruby-on-rails redirect ruby-on-rails-4 routing routes

所以我有一个从我正在迁移的旧CMS生成的URL。我想做的不是支持旧的URL结构,只需要永久性地重定向到新的URL结构。

但知道新标题的唯一方法是标题是否相同/相似。

所以我不知道这是否可能,但这里有一些URL差异的例子:

====== OLD =======

http://www.example.com/rbt/26741-pnpyo-saddened-at-passing-of-roger-clarke.html

======新=======

http://www.example.com/pnpyo-saddened-at-passing-of-roger-clarke

====== OLD =======

http://www.example.com/rbt/26766-algaj-pays-tribute-to-the-honourable-roger-clarke.html

======新=======

http://www.example.com/algaj-pays-tribute-to-the-honourable-roger-clarke

====== OLD =======

http://www.example.com/rbt/26738-pnp-chairman-expresses-shock%2C-grief-at-clarke%E2%80%99s-passing.html

======新=======

http://www.example.com/pnp-chairman-expresses-shock-grief-at-clarke-s-passing

因此,URL结构中的主要区别是前缀/rbt/12345,其中12345是某个ID,/rbt/是静态字符串/目录名称,URL的编码方式(例如它可以处理撇号等,并在最后进行扩展。

理想情况下,如果我的routes.rb规则可以查看上述每个旧网址请求并执行永久301重定向到新的和改进的网址,那就太好了。

这甚至可能吗?如果是这样,那可能是什么样的?

2 个答案:

答案 0 :(得分:3)

您需要在config / routes.rb

中设置重定向(301)
# old path
get '/rbt/:name', to: redirect {|path_params, _| "/#{path_params[:name].gsub(/^\d+\-/, '')}" } 
# new path
get ':name',      to: 'posts#show'

然后确保您拥有一个控制器(在本例中为博客),以捕获新的重定向。

您可以在此处阅读更多内容:http://guides.rubyonrails.org/routing.html#redirection

答案 1 :(得分:0)

我不知道你有多少这些网址或者必须重定向但这里只是一种快速而肮脏的方法,这只是你可以做到的方法之一。我会将旧网址存储在一个简单的路由表中#34;使用旧网址中的数字和新应用中的新完整网址。

在routes.rb

中创建路线

get 'rbt/:old_url', to: 'routes_controller#routing'

然后在路由方法的RoutesController中执行以下操作:

def routing
  myid = params[:old_url].split('-').first
  redirect_to UrlTable.find(myid.to_i).url, :status => moved_permanently
end

我还会添加一个计数器来查看仍有多少人使用旧网址。我知道它不漂亮但确定有效。