Ruby on Rails 301重定向

8
我给一些模型添加了“slugs”,但由于SEO的原因,我需要从旧链接进行301重定向: 旧链接:
http://host.com/foo/1

新的:
http://host.com/foo/foo_slug

问题: 如何在这种情况下实现301重定向? 并且是否可以从大写的链接中实现301重定向?像这样:
http://host.com/foo/FOO_SLUG -> http://host.com/foo/foo_slug
2个回答

18

您可以通过将以下内容添加到控制器操作中来使用状态码301重定向:

redirect_to "http://host.com/foo/foo_slug", :status => 301

有关详细信息,请参阅redirect_to的API文档。

重定向大写URL到小写版本应该没有问题,尽管这可能更好地由HTTP服务器层的某些内容处理,例如Apachemod_rewrite规则。


谢谢您的回答。另外,Rails 3允许直接从routes.rb创建301重定向,那么在控制器中还是在路由中执行更好呢? - xamenrax
1
在您的情况下,我认为您将不得不在控制器操作中执行它,因为我假设您将从数据库中查找slug?如果是这样,查找记录并找到其slug的代码只能出现在控制器操作中,而不能出现在“routes.rb”中。 - Stuart M
1
我只需要检查参数中是否有旧的:id,如果是,则重定向到具有正确slug的instance_path。 - xamenrax
没错,但是为了将 :id 转换成正确的 slug,你必须运行一个数据库查询,对吗?如果是这样,那么它必须在控制器中完成,而不是在路由中。 - Stuart M
1
我认为只要你的Rails路由正确地将包含许多斜杠的URL路由到包含重定向的控制器路由,那么相同的“redirect_to”调用就可以处理它。 - Stuart M
显示剩余2条评论

2

要进行301重定向,请在您的控制器中编写以下代码:

headers["Status"] = "301 Moved Permanently"

redirect_to "http://host.com/foo/foo_slug" # 在您的情况下

至于第二个问题,如果您提到了硬编码URL,请使用大写或小写。

否则请使用Ruby内插,将整个URL放入字符串中。


不要硬编码 Status 头,为什么不直接传递 :status => 301 让 Rails 处理格式化该头部呢(请参见我的答案示例)? - Stuart M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接