rutas rails que ruby-on-rails routing rails-routing

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.