如何在 Rails 应用程序中删除 URL 的尾部斜杠? (在 SEO 视图中)

Posted

技术标签:

【中文标题】如何在 Rails 应用程序中删除 URL 的尾部斜杠? (在 SEO 视图中)【英文标题】:How to remove a URL's trailing slash in a Rails app? (in a SEO view) 【发布时间】:2010-10-12 05:42:18 【问题描述】:

为了避免内容重复,我希望避免我网站的页面可以通过多个 URL 访问(带有或不带有斜杠)。

目前,网址

catalog/product/1

catalog/product/1/

指向同一页面。我的目标是第二个 URL 重定向到第一个(重定向 301,当然)。除了我的主页 / 显然之外,我网站的任何页面都不应使用尾部斜杠访问。

最好的方法是什么?使用 .htaccess 或 routes.rb?你会怎么做?

注意:我正在使用 Ruby on Rails 1.2.3 进行开发

【问题讨论】:

【参考方案1】:

您可以使用 http://github.com/jtrupiano/rack-rewrite 进行 url 重写以独立于网络服务器的差异。

rails 应用中的示例用法:

config.gem 'rack-rewrite', '~> 1.0.0'
require 'rack/rewrite'
config.middleware.insert_before(Rack::Lock, Rack::Rewrite) do
  r301 %r(.+)/$, '$1'
end

【讨论】:

在 Rails 4 中,您需要将 Rack::Lock 替换为 Rack::Runtime(或其他),因为在 Rails 4 中默认启用的多线程 Rails 环境中不存在 Rack::Lock . 当有查询参数时,这不会删除尾随/【参考方案2】:

您可以使用 rack-rewrite gem 来做到这一点。方法如下:http://nanceskitchen.com/2010/05/19/seo-heroku-ruby-on-rails-and-removing-those-darn-trailing-slashes/

【讨论】:

【参考方案3】:

我会使用Apache's mod_rewrite。试试这个:

RewriteEngine on
RewriteRule ^(.+)/$ $1 [R=301,L]

编辑:添加了 R=301。我猜这与默认的 302 相比有 SEO 优势。

【讨论】:

感谢您的回答。我刚刚对其进行了测试并观察到了一个奇怪的行为:它重写了 URL 添加了页面的绝对路径!例如,如果我尝试访问mysite.com/test,它会重定向到mysite.com/home/mysite/public_html/test!你明白吗? 嗯,您可能需要在 RewriteRule 行之前添加“RewriteBase /”。【参考方案4】:

您无法使用 routes.rb 获得重定向。我想您可以构建一个仅发出重定向并将所有以“/”结尾的 URL 指向它的控制器,但这似乎不必要地复杂。相反,我会在 .htaccess 文件中使用 mod_rewrite:

RewriteRule ^(.+)/$ $1 [R=301,L]

【讨论】:

以上是关于如何在 Rails 应用程序中删除 URL 的尾部斜杠? (在 SEO 视图中)的主要内容,如果未能解决你的问题,请参考以下文章

从 Magento URL 中删除尾部斜杠

从url中删除尾部斜杠

htaccess:从以.xml / only结尾的URL中删除尾部斜杠

Htaccess:从URL添加/删除尾部斜杠

nginx 重写URL尾部斜杠

删除web URL中的扩展名和尾部斜杠: