22

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

我怎样才能在铁路路线中做到这一点?

4

6 回答 6

43

这适用于 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
于 2012-06-06T17:32:24.227 回答
6

这完成了另一个答案的工作。此外,它还保留了查询字符串。(导轨 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。

于 2014-12-01T01:06:20.817 回答
3

以下解决方案在所有其他请求上返回 http 400 时重定向多个域GETHEAD请求(根据类似问题中的此评论)。

/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效果很好。

于 2015-06-08T20:41:29.903 回答
2

更现代的方法:

constraints(host: 'www.mydomain.com') do
    get '/:param' => redirect('https://www.mynewurl.com/:param')
end
于 2019-05-28T14:21:07.310 回答
2

与其他答案类似,这个对我有用:

# config/routes.rb
constraints(host: "foo.com", format: "html") do
  get ":any", to: redirect(host: "bar.com", path: "/%{any}"), any: /.*/
end
于 2020-06-22T18:39:18.003 回答
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 重定向。

于 2020-02-03T08:02:32.957 回答