У меня действительно странная проблема: каждый раз, когда я пытаюсь просмотреть свое приложение 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'