如何使用Rails 3 / Rack在没有www的情况下重定向?

问题描述 投票:37回答:9

我知道有很多问题可以回答这个问题。我熟悉.htaccessnginx.conf方法,但无法在Heroku上使用这种传统的配置方法。

Simone Carletti给出了利用Rails 2.x Metals的答案,但是我正在使用Rails 3,但这不兼容:

Redirect non-www requests to www URLs in Ruby on Rails

请注意:

我不是在ApplicationController中寻找简单的before_filter。我想完成一个类似于西蒙妮的重写。我认为至少这对于像Rack这样的Web服务器或中间件来说是一件好事,因此我想在实际的应用程序代码中忽略这一点。

目标

redirect                to                  status
----------------------------------------------------
www.foo.com             foo.com             301
www.foo.com/whatever    foo.com/whatever    301
/^www\./匹配的

Only主机应重定向。其他所有请求都应忽略。

ruby-on-rails redirect ruby-on-rails-3 seo rack
9个回答
51
投票

Ruby on Rails 4]中,删除www。只需使用以下方法即可在保持路径名的同时从任何URL进行访问:

# config/routes.rb

constraints subdomain: 'www' do
  get ':any', to: redirect(subdomain: nil, path: '/%{any}'), any: /.*/
end

相反,添加www。到尚无此URL的开头可以通过以下方法实现:

# config/routes.rb

constraints subdomain: false do
  get ':any', to: redirect(subdomain: 'www', path: '/%{any}'), any: /.*/
end

13
投票

如果您使用的是Rails 3,这是一种更好的方法。只是利用路由的出色功能。


12
投票

我真的很喜欢使用Rails Router这样的东西。以前的答案很好,但是我想要一些通用的东西,我可以将其用于任何以“ www”开头的网址。


7
投票

看看这个中间件,它应该完全按照您想要的方式工作:


7
投票

Duke解决方案的单行版本。只需添加到routes.rb的顶部


6
投票

在Rails 3中


3
投票

如果要从顶级域(TLD)重定向到www子域,请使用此代码:


3
投票

对于Rails 4,上述解决方案必须附加在Verb结构上,例如via: [:get, :post]。杜克大学的解决方案成为:


2
投票

上面的方法没什么问题,但是也有一些提供Rack中间件的工具可以做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.