Ruby on Rails重定向www。到非www版网站

时间:2014-03-06 21:06:59

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

我想重定向www。版本到网站的非www版本,除非它是子域名。 (例如:将www.puppies.com重定向到puppies.com,但不要重定向www.cute.puppies.com)。

如何在保持完整请求路径的同时完成此操作? (例如:www.puppies.com/labradors转到puppies.com/labradors)

5 个答案:

答案 0 :(得分:13)

在您的应用程序控制器中:

before_filter :redirect_subdomain

def redirect_subdomain
  if request.host == 'www.puppies.com'
    redirect_to 'http://puppies.com' + request.fullpath, :status => 301
  end
end

正如@isaffe指出的那样,您也可以在Web服务器中重定向。

编辑:使用永久重定向状态(301)进行搜索引擎优化(如@CHawk所示)或307(如果是临时的)。

答案 1 :(得分:4)

为了完整起见,您可以使用导轨'路由配置使用request-based routing constraints

在Rails 4中执行此操作

与使用应用程序控制器相比,这种方式具有较小的性能优势,因为请求不需要在Rails'处理过程中处理您的应用程序代码。路由中间件。

将以下内容放在路线文件(config/routes.rb

例如:

Rails.application.routes.draw do

  # match urls where the host starts with 'www.' as long it's not followed by 'cute.'
  constraints(host: /^www\.(?!cute\.)/i) do 

    match '(*any)', via: :all, to: redirect { |params, request|

      # parse the current request url
      # tap in and remove www. 
      URI.parse(request.url).tap { |uri| uri.host.sub!(/^www\./i, '') }.to_s 

    }

  end

  # your app's other routes here...

end

答案 2 :(得分:1)

在您的应用程序控制器中:

  before_action :redirect_from_www_to_non_www_host

  def redirect_from_www_to_non_www_host
    domain_parts = request.host.split('.')
    if domain_parts.first == 'www'
      redirect_to(request.original_url.gsub('www.', ''), status: 301) and return  
    end
  end

答案 3 :(得分:1)

如果您来自2018/2019,并且使用Rails 5 +

使用@noel的答案,但要更改:

before_filter

收件人:

before_action

答案 4 :(得分:0)

这可以通过多种方式实现。如果您使用nginx或apache来预读应用程序,请查看url rewrite。

在这里查看我的答案

Is it possible to redirect a url that uses HTTPS protocol? (Heroku, Rails)