如何使用Rails的路线从一个域重定向到另一个?(How can I use Rails route

2019-06-25 06:48发布

用我的应用程序上运行foo.tld,但现在它运行在bar.tld。 请求仍将进来foo.tld,我想重定向他们bar.tld。

我怎样才能做到这一点的轨道路线?

Answer 1:

这部作品在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


Answer 2:

这确实对方的回答的工作。 虽然另外,它保留查询字符串为好 。 (轨道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

注意:如果你处理的全域而不是仅仅子域,使用方法:域名来代替:主机。



Answer 3:

下面的解决方案上重定向多个域GETHEAD请求,同时(按照上所有其他请求返回HTTP 400 此评论在一个类似的问题)。

/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工作的罚款。



文章来源: How can I use Rails routes to redirect from one domain to another?