O Firefox e o Chrome continuam forçando o aplicativo HTTPS on Rails usando nginx / Passenger

7

Eu tenho um problema muito estranho aqui, onde toda vez que tento navegar no meu aplicativo Rails no modo não-SSL, o Chrome (v16) e o Firefox (v7) continuam forçando meu site a ser exibido em HTTPS.

O aplicativo My Rails é implantado em um Ubuntu VPS usando Capistrano, nginx, Passenger e um certificado SSL curinga.

Eu configurei esses parâmetros para a porta 80 no nginx.conf:

            passenger_set_cgi_param HTTP_X_FORWARDED_PROTO http;
            passenger_set_cgi_param HTTPS off;

A versão longa do meu nginx.conf pode ser encontrada aqui: link

O arquivo ssl-redirect.include contém:

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

É para garantir que essas três páginas usem HTTPS quando provenientes de solicitações não SSL.

Meu arquivo production.rb contém esta linha:

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

Eu tentei redirecionar para o HTTP via reescritas do nginx, redirecionamentos do Ruby on Rails e também usei o URL de visualização do Rails usando o protocolo HTTP.

Meu arquivo application.rb contém esses métodos usados em um gancho before_filter:

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

Sempre que tento redirecionar para HTTP não-SSL, o navegador tenta redirecioná-lo de volta para HTTPS, causando um loop de redirecionamento infinito. O Safari, no entanto, funciona muito bem. Mesmo quando desabilitei a exibição de SSL no nginx, os navegadores ainda tentam se conectar ao site usando HTTPS. Eu também devo mencionar que quando eu empurrei meu aplicativo para o Heroku, o redirecionamento do Rails funciona muito bem para todos os navegadores.

O motivo pelo qual desejo usar o não SSL é que minha página inicial contém objetos incorporados dinâmicos não seguros e um CDN não seguro, e quero evitar avisos de segurança.

Não sei o que está fazendo com que o navegador continue forçando solicitações HTTPS.

    
por Steve 01.01.2012 / 20:06

2 respostas

9

Se você usou config.force_ssl = true em sua configuração de ambiente e depois desativá-lo, seu navegador ainda pode fazer conexões apenas por SSL.

O Rails envia um cabeçalho HSTS quando force_ssl for verdadeiro, o que fará com que alguns navegadores permitam somente conexões via HTTPS para o domínio em questão, independentemente do que foi introduzido na barra de endereço. Esta configuração será armazenada em cache pelo navegador por 1 ano por padrão.

Veja algumas dicas de como evitar isso neste post do blog: link

    
por 01.12.2012 / 02:14
5

Eu encontrei uma maneira de desativar a HSTS de uma resposta em um fórum de suporte do Wordpress de todos os lugares: link

Você pode enviar de volta um cabeçalho que desativará o armazenamento em cache de HSTS. Testado no Chrome com este exemplo before_filter em um aplicativo do Rails 4:

response.headers['Strict-Transport-Security'] = 'max-age=0; includeSubDomains'
    
por 08.12.2014 / 10:49