Мое приложение используется для запуска на foo.tld, но теперь оно работает на bar.tld. Запросы будут по-прежнему появляться в foo.tld, я хочу перенаправить их на bar.tld.
Как это сделать в маршрутах rails?
Мое приложение используется для запуска на foo.tld, но теперь оно работает на bar.tld. Запросы будут по-прежнему появляться в foo.tld, я хочу перенаправить их на bar.tld.
Как это сделать в маршрутах rails?
Это работает в 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
Это задание другого ответа. Хотя, кроме того, он сохраняет строки запроса, а также. (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.
Следующее решение перенаправляет несколько доменов на запросы 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
не работал у меня на heroku, но constraints: Constraints::DomainRedirectConstraint.new
работал нормально.