Редирект с www средствами роутинга в Ruby on Rails

В большинстве случаев редирект с поддомена www на домен второго уровня (или обратно) реализуется на уровне web-сервера (например, apache или nginx). Вот пример редиректа, настраиваемого в конфиге nginx:

        if ($host = 'www.dhampik.ru') {
                rewrite  ^/(.*)$  http://dhampik.ru/$1  permanent;
        }

Однако такая возможность имеется не всегда - иногда просто нет доступа к настройкам web-сервера, например, если вы используете хостинг heroku. В этом случае может помочь настройка редиректа средствами роутинга в Ruby on Rails.

Редирект с поддомена www на домен 2го уровня делается следующими строчками в файле config/routes.rb:

  constraints(host: 'www.example.com') do
    root to: redirect("http://example.com/"), as: 'root_redirect'
    match '/*path', to: redirect {|params| "http://example.com/#{params[:path]}"}, via: :all
  end

Следует отметить, что обязательно необходимо 2 записи для корня и для всех остальных адресов. Кроме того обязательно указывать алиас as: 'root_redirect', так как у вас скорее всего задан другой корневой роут и возникнет конфликт, если этого не сделать. Также для правила match в последних версиях рельс обязательно явное указание разрешенных методов. В нашем случае указано, что редирект нужно делать для всех методов - GET, POST и др.

Аналогичным способом делается и редирект в обратную сторону. Что важнее — адрес с www или же без него — решать вам. Хотя лично я предпочитаю адрес без www — он и короче и современнее, хотя споров на эту тему много.

UPD: кажется, что у reg.ru все же нельзя настроить CNAME для домена второго уровня, как это описано ниже, ибо на следующий день пришло сообщение о том, что яндекс.почта для домена отвалилась из-за неправильной настройки DNS. И вообще это запрещено спецификацией и порождает конфликты. А некоторые регистраторы предоставляют специальные инструменты для обхода этого.

Подобная настройка в совокупности с возможностью указать @ в CNAME для доменов второго уровня у некоторых хостеров, например, reg.ru (несмотря на предупреждение от heroku) позволит немного сэкномить на услуге web-forwarding.