There are multiple ways to redirect URLs to a different URL in Rails, and they differ in small but important nuances.
Imagine you want to redirect the following url https://www.example.com/old_location?foo=bar
to https://www.example.com/new_location?foo=bar
.
You can use ActionController::Redirecting#redirect_to
in a controller action
class SomeController < ActionController::Base
def old_location
redirect_to(new_location_url(params.permit(:foo)))
end
end
This will:
ActionController::UnfilteredParameters
if there is any other query param than foo
, e.g. https://www.example.com/old_location?another_param=1
. This is because url_for
will call to_h
on ActionController::Parameters
, which will raise if there are unpermitted parameters.You can also use ActionDispatch::Routing::Redirection#redirect
in the routes.rb
file:
get 'old_location', redirect(path: '/new_location')
This will:
https://example.com/old_location?b=b
will redirect to https://example.com/new_location?b=b
.You can achieve the same forwarding of query parameters with variant A as explained here, but please be aware of its security implications.
Both variants have options to change their default behaviour.
If you have a public facing website that ranks on search engines, choosing the correct redirect code is important. If you decide to change your url structure and want the search engines to index the new target url (/new_location?foo=bar
) then you should use a 301. You can more about how google handles this
here
Show archive.org snapshot
.