ruby on rails - que - ¿Cómo puedo usar las rutas de Rails para redirigir de un dominio a otro?
scaffold ruby on rails (3)
Mi aplicación solía ejecutarse en foo.tld pero ahora se ejecuta en bar.tld. Las solicitudes seguirán llegando para foo.tld, quiero redirigirlas a bar.tld.
¿Cómo puedo hacer esto en las rutas ferroviarias?
Esto funciona en Rails 3.2.3.
constraints(:host => /foo.tld/) do
match "/(*path)" => redirect {|params, req| "http://bar.tld/#{params[:path]}"}
end
Esto funciona en Rails 4.0.
constraints(:host => /foo.tld/) do
match "/(*path)" => redirect {|params, req| "http://bar.tld/#{params[:path]}"}, via: [:get, :post]
end
Esto hace el trabajo de la otra respuesta. Aunque además, también preserva las cadenas de consulta . (Rieles 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
Nota: si está tratando con dominios completos en lugar de solo subdominios, use: dominio en lugar de: host.
La siguiente solución redirige varios dominios en las solicitudes GET
y HEAD
tiempo que devuelve http 400 en todas las demás solicitudes (según este comentario en una pregunta similar).
/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
Por alguna razón, las constraints Constraints::DomainRedirectConstraint.new do
no me funcionaron en heroku, pero las constraints: Constraints::DomainRedirectConstraint.new
funcionaron bien.