Rails перенаправляет с https

я поддерживаю сайт Ruby on Rails, и яЯ не совсем понимаю, как выполнять перенаправления на относительные URL-адреса с использованием протокола https.

Я могу успешно создать перенаправление на относительный URL-адрес, используя http, например:

redirect_to "/some_directory/"

Но я не могу понять, как создать перенаправление на URL, используя протокол https. Я смог сделать это только с помощью абсолютных URL-адресов, например:

redirect_to "https://mysite.com/some_directory/"

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

 scottd02 нояб. 2009 г., 22:59
Могу ли я получить разъяснения по вашему вопросу? Вы хотите, чтобы люди всегда использовали HTTPS на вашем сайте или только для некоторых URL? По умолчанию RAILS продолжит использовать HTTPS, если текущий запрос HTTPS.

Ответы на вопрос(8)

Откройте класс, который имеетredirect_to и добавить методredirect_to_secure_of с соответствующей реализацией. Затем позвоните:

redirect_to_secure_of "/some_directory/"

Поместите этот метод вlib каталог или где-нибудь полезное.

 yfeldblum02 нояб. 2009 г., 18:17
Извините, я думал, что вы спрашиваете, как сделатьпризвание код чистый.
 Brian D'Astous02 нояб. 2009 г., 17:56
Спасибо но яищу чуть больше деталей, чемсоответствующая реализация ".

хост. Если вы хотите изменить используемый протокол, вам нужно указать абсолютный URL. Я бы взял правосудиеСовет и создайте метод, который сделает это за вас:

def redirect_to_secure(relative_uri)
  redirect_to "https://" + request.host + relative_uri
end

force_ssl_redirect before_action для применения ssl для одного контроллера. Обратите внимание, что при использовании этого метода ваши куки выигралибыть помечены как безопасные иHSTS не используется

 max pleaner14 янв. 2016 г., 00:28
Можете ли вы уточнить последнее предложение? Для кого-то незнакомого с 'маркировка файлов cookie как безопасных и HSTS.
Решение Вопроса

сгенерированным в контроллерах, вы можете переопределить метод url_options в вашем контроллере приложения. Вы можете заставить протокол сгенерированных URL-адресов в зависимости от env рельсы, например, так:

 def url_options
    super
    @_url_options.dup.tap do |options|
      options[:protocol] = Rails.env.production? ? "https://" : "http://"
      options.freeze
    end
  end

этот пример работает в рельсах 3.2.1, яЯ точно не уверен в более ранних или будущих версиях.

Если вы хотите, чтобы вашвсе приложение будет обслуживаться через https, так какRails 4.0 лучший способ сделать это, чтобы включитьforce_ssl в конфигурационном файле вот так:

# config/environments/production.rb
Rails.application.configure do
  # [..]

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

По умолчанию эта опция уже присутствует вconfig/environments/production.rb во вновь созданных приложениях, но закомментировано.

Как говорится в комментарии, это не только перенаправит на https, но и установитStrict-Transport-Security заголовок (HSTS) и следит за тем, чтобы флаг безопасности был установлен на всех файлах cookie. Обе меры повышают безопасность вашего приложения без существенных недостатков. Оно использует .ActionDispatch:SSL

Настройки истечения HSTS по умолчанию установлены на год и неt включает субдомены, что, вероятно, хорошо для большинства приложений. Вы можете настроить это сhsts опция:

config.hsts = {
  expires: 1.month.to_i,
  subdomains: false,
}

Если ты'снова работаетРельсы 3 (>= 3.1) или неЕсли вы хотите использовать https для всего приложения, вы можете использоватьforce_ssl метод в контроллере:

class SecureController < ApplicationController
  force_ssl
end

Тот'все. Вы можете установить его для контроллера или в вашемApplicationController, Вы можете принудительно установить https, используя знакомуюif или жеunless опции; например:

# Only when we're not in development or tests
force_ssl unless: -> { Rails.env.in? ['development', 'test'] }
 Christian Fazzini24 авг. 2018 г., 07:51
AWS позволяет завершать SSL на балансировщике нагрузки. Который затем перенаправляет незашифрованные данные в экземпляры EC2 (где развернуто ваше приложение). К несчастью,force_ssl не является хорошим вариантом здесь, даже сunless условие указано выше
 Chris Hough01 июн. 2018 г., 20:53
@MichaelJohnston: это следует включать только в производственной среде и не повлияет на ваши локальные настройки разработки
 Martin Tournoij22 апр. 2017 г., 08:04
@MichaelJohnston Вот почему вы можете использоватьunless не заставлять SSL в dev (см. последнюю строку в моем ответе).
 Michael Johnston22 апр. 2017 г., 01:30
force_ssl - не лучший вариант, если вы разрабатываете за туннелем. Например, туннель ngrok tls позволяет указать сертификат. Затем ngrok завершает соединение tls с указанным сертификатом и пересылает незашифрованное в ваше приложение (поэтому ваше приложение считает, что все является http). Это означает, что вы неНужно настроить прокси-сервер nginx и выполнить https на вашем компьютере для разработки.

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

У меня была ситуация, когда мне нужно было использовать Railshttps Proto в помощниках URL и т. д., хотя источник всех запросов не зашифрован (http).

Теперь, обычно в этой ситуации (что нормально, когда Rails находится за обратным прокси-сервером или балансировщиком нагрузки и т. Д.),x-forwarded-proto заголовок устанавливается обратным прокси-сервером или чем-то еще, поэтому, несмотря на то, что запросы между прокси и рельсы (вероятно, не рекомендуется в производстве, кстати) рельсы думают, что все в.https

Мне нужно было бежать за туннелем ngrok tls. Я хотел, чтобы ngrok прервал tls с помощью указанных мной сертификатов letsencrypt. Однако при этом ngrok не предлагает возможность настраивать заголовки, включая настройкуx-forwarded-proto (хотя эта функция планируется в какой-то момент в будущем).

Решение оказалось довольно простым: Rails не зависит ни от протокола происхождения, ни отx-forwarded-proto устанавливается напрямую, но на Rack env varrack.url_scheme, Поэтому мне просто нужно было добавить это промежуточное программное обеспечение Rack в процессе разработки:

class ForceUrlScheme
  def initialize(app)
    @app = app
  end

  def call(env)
    env['rack.url_scheme'] = 'https'
    @app.call(env)
  end
end
Решение Вопроса

ssl_requirement и не заботится, если ссылка или перенаправление или нетт используя https. С помощью ssl_requirement вы объявляете, какие действия требуют SSL, какие способны к SSL, а какие не используют SSL.

Если ты'перенаправить куда-нибудь за пределы вашего Rails-приложения, а затем указать протокол, как предполагает Олли, будет работать.

 Spundun13 авг. 2014 г., 01:21
Мэтт, если вы сделали свой комментарий отдельным ответом, ябуду голосовать за это.
 Matt Sanders12 авг. 2013 г., 17:22
В эти дни посмотрим наforce_ssl, доступно в рельсах 3.1 и выше.

ActionController::Base#redirect_to Метод принимает хеш опций, один из параметров которого:protocol который позволяет вам звонить:

redirect_to :protocol =>             :controller => 'some_controller', 
            :action => 'index'

Смотрите определение для#redirect_to а также#url_for для получения дополнительной информации о вариантах.

В качестве альтернативы, и особенно, если SSL должен использоваться для всех ваших действий контроллера, вы можете использовать более декларативный подход, используяbefore_filter, ВApplicationController Вы можете определить следующий метод:

def redirect_to_https
    redirect_to :protocol => "https://" unless (request.ssl? || request.local?)
end

Затем вы можете добавить фильтры в те контроллеры, которые выполняют действия, требующие SSL, например:

class YourController
    before_filter :redirect_to_https, :only => ["index", "show"]
end

Или, если вам требуется SSL для всего вашего приложения, объявите фильтр в:ApplicationController

class ApplicationController
    before_filter :redirect_to_https
end
 Michael Sepcot03 нояб. 2009 г., 16:13
Ты можешь использовать:protocol => 'https://' если вы передаете хешredirect_to если вы передаете относительный URL, как в вопросе выше, это не будет работать. Я согласен, чтоbefore_filter это лучший способ пойти в целом.
 Chenglu10 дек. 2018 г., 07:24
Будьте осторожны с этим, перенаправление сбросит все параметры. Если вы хотите перенаправитьПРОСТО ДЛЯ протокол, вы должны позвонить так:redirect_to({:protocol => "https://"}.merge(request.parameters))

Ваш ответ на вопрос