Как я могу использовать маршруты Rails для перенаправления из одного домена в другой?

Мое приложение раньше запускалось на foo.tld, но теперь оно работает на bar.tld. Запросы по-прежнему будут поступать для foo.tld, я хочу перенаправить их в bar.tld.

Как я могу сделать это на маршрутах рельсов?

 mmike20 окт. 2016 г., 10:30
Вы можете сделать это в application_controller: if request.host == "some.site" apos; redirect_to url_for (хост: «сайт», поддомен: «другой»), статус:: Move_permanently конец
 Anil06 июн. 2012 г., 18:55
Рассматривали ли вы переадресацию DNS?

Ответы на вопрос(3)

Следующее решение перенаправляет несколько доменов наGET а такжеHEAD запросы при возврате 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 не работал у меня на героку, ноconstraints: Constraints::DomainRedirectConstraint.new работал нормально.

Это делает работу другого ответа. Хотя, кроме того, этоpreserves query strings as well, (Рельсы 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

Примечание. Если вы имеете дело с полными доменами, а не только с поддоменами, используйте: домен вместо: хост.

 04 июн. 2015 г., 23:53
На самом деле"http://bar.tld#{req.fullpath}" так какreq.fullpath уже содержит переднюю косую черту.
 27 февр. 2015 г., 11:09
"http://bar.tld/#{req.fullpath}" легко.
Решение Вопроса

Это работает в 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
 15 мая 2013 г., 18:25
Маршрут splat сам по себе соответствует непустой строке, поэтому корневой URL не будет совпадать. Просто добавьте скобки:match "/(*path)"...
 27 февр. 2014 г., 11:01
Используйте // вместо http: //, чтобы гарантировать, что перенаправление не зависит от протокола и работает как для http, так и для https.
 05 нояб. 2013 г., 00:48
Rails 4: добавитьvia: [:get, :post] кmatch опции
 12 мар. 2015 г., 01:00
Любопытно, почему бы не использовать: & quot; через: [: get,: post,: put,: patch,: delete] & quot;
 12 окт. 2012 г., 22:33
Для меня это работало везде, кроме домашней страницы. Решение достаточно хорошее для меня. Большое спасибо.

Ваш ответ на вопрос