Rails - как перенаправить с http://example.com на https://www.example.com

Я хочу узнать, как очистить URL-адреса приложений. Мое приложение работает от Rails 3 на Heroku.

Желаемый URL-адрес https://www.example.comite.com

Я хотел бы перенаправить все URL-адреса в отличие от вышеуказанного URL. Это вещь Rails или DNS?

Плохие URL-адреса:

https://example.comite.com
http://www.example.comite.com
http://example.comite.com

И если что-то заканчивается, например http://www.example.comite.com/photo/1 для перенаправления URL-адреса с помощью пути: https://www.example.comite.com/photo/1

Ответ 1

Записи DNS не могут определять протокол для домена, поэтому вы не можете перенаправить http:// в https:// через DNS. Выполнение этой настройки через конфигурацию веб-сервера не переносимо, трудно сделать, подвержено ошибкам и просто устарело. Это работа, которая лучше всего обрабатывается маршрутизатором Rails.

# beginning of routes.rb 
match "*path" => redirect("https://www.mysite.com/%{path}"), :constraints => { :protocol => "http://" }
match "*path" => redirect("https://www.mysite.com/%{path}"), :constraints => { :subdomain => "" }

Ответ 2

Как расширение user2100689 answer, в Rails 3+ вы можете использовать config.force_ssl = true в config/environment/production.rb

Линию можно просто расколоть следующим образом

# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
config.force_ssl = true

Ответ 3

Вы всегда можете бросить это в своем production.rb... config.use_ssl = true

Ответ 4

Поскольку это Heroku, вы не можете использовать конфигурации apache или nginx. Что вы можете сделать, так это поставить перед вашим фильтром before_filter, если у вас есть 3 или более контроллера эти ниже, хотя, конечно, они будут в отдельных файлах

class ApplicationController < ActionController::Base
    def redirect_https        
        redirect_to :protocol => "https://" unless request.ssl?
        return true
    end
    before_filter :redirect_https
end
class TypicalController < ApplicationController
    def blah
    end
end
class HomePageController < ApplicationController
    skip_before_filter :redirect_https
end

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

счастливый взлом.

Ответ 5

Rails 3.1.0 и выше имеет force_ssl, который является методом контроллера, который будет перенаправлять на https для сред, не относящихся к разработке.

http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html

Поместите его в каждый контроллер, который вы хотите перенаправить, или еще лучше, поместите его в свой ApplicationController:

приложение/контроллеры/application.rb:

class ApplicationController < ActionController::Base
  # ...
  force_ssl
  # ...
end

Это хорошая вещь, которая всегда включается в ваши приложения (и, конечно же, вам нужно будет получить сертификат). HTTPS везде!

Ответ 6

Сделайте это в своем файле vhosts.

Настройка хоста SSL.

В вашем стандартном порту 80 виртуальный хост. Добавьте это в конфигурацию:

Redirect permanent / https://www.mysite.com

Это переадресует все запросы на порт 80 на https.