Rails Applications sometimes have their domain names swapped for something new. This can happen due to a rebranding, sale of the business or any other reason. In our case it was a rebranding. We had a Ruby on Rails application at https://storeconnect.app and it needed to be moved to https://GetStoreConnect.com.
Looking at the Rails Routing Guide I couldn’t see any obvious solution for doing this. I knew I could do it with a redirection Rack application, but I wanted something simple, a one liner even, in the routes.rb
file, front and centre and easy to keep track of.
True to form, Rails came through with a simple and maintainable one liner to make it happen. I love working with this language and framework. This is how I did it:
ruby
Rails.application.routes.draw do
# Permanently redirect all requests originally to storeconnect.app to getstoreconnect.com
get '/(*path)', to: redirect { |path_params, request|
"https://getstoreconnect.com/#{path_params[:path]}"
},
status: 301,
constraints: { domain: 'storeconnect.app' }
# ... Remaining application routes
end
Simple.
The way it works, is we make a catch all route on get requests to the application. We put the *path
matcher in there to capture anything after the forward slash.
We use *path
instead of :path
so that we get everything, not just the next path segment, otherwise /about/location
would not match.
We then also wrap *path
in parenthesis to make it optional (otherwise just going to old-domain.com/
would not match).
Then we redirect all of these with a 301 to the new domain and pass the same path variable back in. We can’t use the shorthand method of redirect("https://getstoreconnect.com/%{path}")
here because the path key may not be present and so would fail on matching the root domain.
We then put a constraint so that this will only match if the request domain is old-domain.com
.
And there you go, a one liner (wrapped) :)