Last Updated: December 19, 2019
· dommmel

redirect to canonical host in Rails 4

Sometimes you want to use a single host name for your app and have requests for other host names redirected to the canonical host.

Example:* should redirect to*`

You could use rack middleware gem like rack-canonical-host or rack-rewrite.

You can also achieve the same result without any additional gem by using contraints in Rails's routes.

in config/routes.rb

if Rails.env.production?
  constraints(:host => /^(?!myfancyapp\.com)/i) do
    match "/(*path)" => redirect {
      |params, req| "{params[:path]}"
      },  via: [:get, :post]

If you – like me – prefer keeping your settings in env variables you can use something along these lines

    constraints(:host =>"^(?!#{Regexp.escape(ENV['CANONICAL_HOST'])})")) do
      match "/(*path)" => redirect { |params, req| "http://#{ENV['CANONICAL_HOST']}/#{params[:path]}" },  via: [:get, :post]

3 Responses
Add your response

Hello, this is my code (similar to yours but its non www/ or non to that domain) :

constraints(:host => /^(?!www.domain\.sk)/i) do
match "/(*path)" => redirect { |params, req| "{params[:path]}" }, via: :all

I run the app on heroku and have all other domains with and without subdomain pointed to with CNAME DNS. When I type any domain combination it redirects me properly to, but the application shows error. Dont you know where might be the problem? Is it heroku or rails specific error?

over 1 year ago ·

not need to help, the mistake was I wrapped with this constraint "rule" all routes, when I included this only to begining of file everything worked fine.

over 1 year ago ·

Maybe is some gem I'm using, but after using this, my confirmation mail (which comes in the link like: /users/confirmation?confirmation_token=XXXXXXX ) stops working. It redirects to /users/confirmation instead, on the new domain.

over 1 year ago ·