Назад | Перейти на главную страницу

Firefox и Chrome продолжают принудительно использовать HTTPS в приложении Rails с помощью nginx / Passenger

У меня действительно странная проблема: каждый раз, когда я пытаюсь просмотреть свое приложение Rails в режиме без SSL, Chrome (v16) и Firefox (v7) заставляют мой веб-сайт обслуживаться по HTTPS.

Приложение My Rails развертывается на Ubuntu VPS с использованием Capistrano, nginx, Passenger и подстановочного SSL-сертификата.

Я установил эти параметры для порта 80 в nginx.conf:

            passenger_set_cgi_param HTTP_X_FORWARDED_PROTO http;
            passenger_set_cgi_param HTTPS off;

Длинную версию моего nginx.conf можно найти здесь: https://gist.github.com/2eab42666c609b015bff

Файл ssl-redirect.include содержит:

rewrite ^/sign_up https://$host$request_uri? permanent ;
rewrite ^/login https://$host$request_uri? permanent ;
rewrite ^/settings/password https://$host$request_uri? permanent ;

Это необходимо для того, чтобы эти три страницы использовали HTTPS при получении запроса без SSL.

Мой файл production.rb содержит эту строку:

  # Enable HTTP and HTTPS in parallel
  config.middleware.insert_before Rack::Lock, Rack::SSL, :exclude => proc { |env| env['HTTPS'] != 'on' }

Я пробовал перенаправить на HTTP с помощью перезаписи nginx, перенаправления Ruby on Rails, а также использовал URL-адрес просмотра Rails с использованием протокола HTTP.

Мой файл application.rb содержит следующие методы, используемые в хуке before_filter:

def force_http
 if Rails.env.production?
   if request.ssl?
     redirect_to :protocol => 'http', :status => :moved_permanently
   end
 end
end

Каждый раз, когда я пытаюсь перенаправить на HTTP без SSL, браузер пытается перенаправить его обратно на HTTPS, вызывая бесконечный цикл перенаправления. Однако Safari работает нормально. Даже когда я отключил поддержку SSL в nginx, браузеры все равно пытаются подключиться к сайту с помощью HTTPS. Я также должен упомянуть, что когда я отправил свое приложение на Heroku, перенаправление Rails отлично работало для всех браузеров.

Причина, по которой я хочу использовать протокол без SSL, заключается в том, что моя домашняя страница содержит незащищенные динамические встроенные объекты и незащищенный CDN, и я хочу предотвратить предупреждения системы безопасности.

Я не знаю, что заставляет браузер продолжать выполнять запросы HTTPS.

Если вы использовали config.force_ssl = true в конфигурации вашей среды, а затем отключите ее, ваш браузер может по-прежнему устанавливать соединения только через ssl.

Rails отправляет Заголовок HSTS когда force_ssl истинно, что приведет к тому, что некоторые браузеры будут разрешать подключения только через HTTPS к рассматриваемому домену, независимо от того, что введено в адресной строке. Этот параметр по умолчанию будет кэшироваться браузером на 1 год.

См. Несколько советов, как этого избежать, в этом сообщении в блоге: http://www.simonecarletti.com/blog/2011/05/configuring-rails-3-https-ssl/#comment-40447

Я нашел способ отключить HSTS из ответа на форуме поддержки Wordpress во всех местах: https://wordpress.org/support/topic/want-to-turn-off-http-strict-transport-security-hsts-header#post-6068192

Вы можете отправить обратно заголовок, который отключит кеширование HSTS. Протестировано в Chrome с этим примером before_filter в приложении Rails 4:

response.headers['Strict-Transport-Security'] = 'max-age=0; includeSubDomains'