Firefox 和 Chrome 不断使用 nginx/Passenger 在 Rails 应用上强制使用 HTTPS

Firefox 和 Chrome 不断使用 nginx/Passenger 在 Rails 应用上强制使用 HTTPS

我遇到了一个非常奇怪的问题,每次我尝试在非 SSL 模式下浏览我的 Rails 应用程序时,Chrome(v16)和 Firefox(v7)都会强制我的网站以 HTTPS 形式提供。

我的 Rails 应用程序使用 Capistrano、nginx、Passenger 和通配符 SSL 证书部署在 Ubuntu VPS 上。

我在 nginx.conf 中为端口 80 设置了以下参数:

            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 ;

这是为了确保这三个页面来自非 SSL 请求时使用 HTTPS。

我的 production.rb 文件包含以下行:

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

我曾尝试通过 nginx 重写、Ruby on Rails 重定向重定向到 HTTP,并且还尝试使用 HTTP 协议的 Rails 查看 url。

我的 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 工作正常。即使我在 nginx 中禁用了 SSL 服务,浏览器仍会尝试使用 HTTPS 连接到站点。我还应该提到,当我将我的应用程序推送到 Heroku 时,Rails 重定向在所有浏览器上都能正常工作。

我之所以要使用非 SSL,是因为我的主页包含不安全的动态嵌入对象和非安全的 CDN,并且我想避免安全警告。

我不知道是什么原因导致浏览器不断强制 HTTPS 请求。

答案1

如果您config.force_ssl = true在环境配置中使用了它,然后稍后将其关闭,您的浏览器可能仍然只能通过 ssl 建立连接。

Rails 发送一个HSTS 标头force_ssl为 true 时,某些浏览器将只允许通过 HTTPS 连接到相关域,而不管地址栏中输入的内容。默认情况下,浏览器会缓存此设置 1 年。

请参阅此博客文章评论中有关如何避免这种情况的一些提示:http://www.simonecarletti.com/blog/2011/05/configuring-rails-3-https-ssl/#comment-40447

答案2

我在 Wordpress 支持论坛上的一个答案中找到了关闭 HSTS 的方法: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'

相关内容