如何使用Rails路由从一个域重定向到另一个域?

时间:2012-06-06 16:47:23

标签: ruby-on-rails routing rails-routing

我的应用曾经在foo.tld上运行,但现在它在bar.tld上运行。请求仍然会出现在foo.tld中,我想将它们重定向到bar.tld。

如何在rails路线中执行此操作?

6 个答案:

答案 0 :(得分:41)

这适用于Rails 3.2.3

constraints(:host => /foo.tld/) do
  match "/(*path)" => redirect {|params, req| "http://bar.tld/#{params[:path]}"}
end

这适用于Rails 4.0

constraints(:host => /foo.tld/) do
  match "/(*path)" => redirect {|params, req| "http://bar.tld/#{params[:path]}"},  via: [:get, :post]
end

答案 1 :(得分:5)

这是另一个答案的工作。此外,还保留了查询字符串。 (Rails 4):

# http://foo.tld?x=y redirects to http://bar.tld?x=y
constraints(:host => /foo.tld/) do
  match '/(*path)' => redirect { |params, req|
    query_params = req.params.except(:path)
    "http://bar.tld/#{params[:path]}#{query_params.keys.any? ? "?" + query_params.to_query : ""}"
  }, via: [:get, :post]
end

注意:如果您要处理完整域而不仅仅是子域,请使用:domain而不是:host。

答案 2 :(得分:3)

以下解决方案重定向GETHEAD个请求的多个域,同时在所有其他请求中返回http 400(在类似问题中按照this comment)。

<强> /lib/constraints/domain_redirect_constraint.rb:

module Constraints
  class DomainRedirectConstraint
    def matches?(request)
      request_host = request.host.downcase
      return request_host == "foo.tld1" || \
             request_host == "foo.tld2" || \
             request_host == "foo.tld3"
    end
  end
end

<强> /config/routes.rb:

require 'constraints/domain_redirect_constraint'

Rails.application.routes.draw do
  match "/(*path)", to: redirect {|p, req| "//bar.tld#{req.fullpath}"}, via: [:get, :head], constraints: Constraints::DomainRedirectConstraint.new
  match "/(*path)", to: proc { [400, {}, ['']] }, via: :all, constraints: Constraints::DomainRedirectConstraint.new

  ...
end

出于某种原因,constraints Constraints::DomainRedirectConstraint.new do在heroku上对我不起作用,但constraints: Constraints::DomainRedirectConstraint.new工作正常。

答案 3 :(得分:1)

constraints(host: /subdomain\.domain\.com/) do
  match '/(*path)' => redirect { |params, req|
    "https://www.example.com#{req.fullpath}"
  }, via: [:get, :head]
end

我在Heroku上使用自定义域时使用了此功能,我想从myapp.herokuapp.com-> www.example.com重定向。

答案 4 :(得分:1)

类似于其他答案,这个为我工作:

# config/routes.rb
constraints(host: "foo.com", format: "html") do
  get ":any", to: redirect(host: "bar.com", path: "/%{any}"), any: /.*/
end

答案 5 :(得分:0)

更现代的方法

constraints(host: 'www.mydomain.com') do
    get '/:param' => redirect('https://www.mynewurl.com/:param')
end