Как перенаправить на www.example.com/products с example.com/products в Rails 2.3.3

Я успешно использовал код для перенаправления моего приложения с example.com на www.example.com

Я использую следующее:

class ApplicationController < ActionController::Base


  before_filter :ensure_domain


  APP_DOMAIN = "www.example.com"
  NAKED_DOMAIN = "example.com"
protected 

  def ensure_domain
    if request.env['HTTP_HOST'] == NAKED_DOMAIN && RAILS_ENV =='production'
      #HTTP 301 is a permanent redirect
        redirect_to "http://#{APP_DOMAIN}", :status => 301
    end
  end

Это отлично работает для ссылок, ведущих на домашнюю страницу.

Однако я только что понял, что если у меня есть следующий URL:

example.com/products

Пользователь перенаправляется на домашнюю страницу www.example.com, а НЕ www.example.com/products.

Как я могу перенаправить на URL-адрес, к которому пользователь пытается получить доступ, но не на корень www.example.com, а не на корень example.com.

Другими словами, если пользователю нужно следующее:

example.com/products

Я отправляю их

www.example.com/products

Спасибо за любую помощь.

Я размещен на Heroku. Я использую Zerigo DNS. Когда я попытался использовать DNS для пересылки всего трафика с голого домена на домен www.example.com, URL-адрес все еще показывает голый домен.

Так что это не сработало.


person chell    schedule 02.07.2016    source источник
comment
Лучше бы это делал ваш сервер, а не код вашего приложения. Вам нужно поймать все URL-адреса, которые никогда не достигают рельсов, таких как статические активы и т. Д., Повторно опубликуйте свой вопрос, включая детали сервера, который вы используете, или, что еще лучше, в настройках DNS.   -  person jamesc    schedule 02.07.2016
comment
Смотрите мой обновленный ответ.   -  person jamesc    schedule 02.07.2016


Ответы (1)


Это работа ваших настроек DNS, а НЕ вашего приложения Rails. Для этого вам необходимо создать записи A.

Вот как Digital Ocean предлагает вам это сделать

https://www.digitalocean.com/community/tutorials/how-to-redirect-www-to-non-www-with-nginx-on-ubuntu-14-04

Таким образом, вы получаете две записи A, указывающие на один и тот же IP-адрес.

  @ your_ip_address
  www your_ip_address

Взгляните на http://jaketrent.com/post/add-zerigo-dns-to-heroku/

Конкретно

  1. Добавить домены на Heroku

Через Heroku cli введите:

1

домены heroku: добавьте www.yourapp.com

Обратите внимание, что мы не хотим добавлять yourapp.com (без «www») таким образом. Если вы это сделаете, инструмент добавит в Zerigo несколько записей A, которые в документации Zerigo явно заявляют, что вы этого не хотите. Эти A-записи активируют маршрутизацию через стек Bamboo, чего вы хотите избежать.

Это должен быть момент, когда вы можете обновить свой браузер на «yourapp.com». Вы должны увидеть, что произошло перенаправление, и вы перейдете на «www.yourapp.com». Маршрутизация должна быть успешной на стороне Heroku. Иногда для распространения этого требуется больше времени, поэтому, если вы не видите результатов сразу, проявите немного терпения, прежде чем начинать изменять конфигурацию, думая, что это не работает.

Или, чтобы сделать это на вашем сервере, пример nGinx может выглядеть так:

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

ПОТЕРПИ. Требуется время, чтобы распространять

Вы абсолютно НЕ должны делать это в своем коде приложения, который подходит для ЛЮБОЙ среды, будь то PHP, Rails или что-то еще.

Вы не предоставили никаких сведений о сервере или домене, в котором вы будете работать, поэтому я не могу предоставить конкретное решение для вашей среды, но вышеуказанного должно быть достаточно для решения вашей проблемы.

person jamesc    schedule 02.07.2016
comment
Спасибо за ответ, Джеймс. Я уже добавил эти домены и использую ZerigoDNS. Я даже поговорил с их сотрудниками службы поддержки и выполнил их инструкции, которые заключались в том, чтобы добавить запись ALIAS, которая указывает корневой домен на домен www. Однако это не сработало. У меня все еще есть этот параметр, и он ничего не делает, и прошло более 30 часов, достаточно долго, чтобы распространяться. Кстати, я нахожусь на кедровой стеке Heroku. - person chell; 02.07.2016
comment
@chell Я бы обратился в службу поддержки zerigo. - person jamesc; 02.07.2016