Rails:为什么我的服务器将http重定向到https

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails:为什么我的服务器将http重定向到https相关的知识,希望对你有一定的参考价值。

我有一个我在Heroku上构建的rails应用程序,我已将其配置为在那里使用SSL。现在我转向AWS EC2,我想让我的应用程序版本在没有SSL的情况下运行。完成后,我将在稍后添加SSL功能。

我的堆栈是Puma + nginx + PostgreSQL,我正在使用Rails 4.2.4,Ruby 2.2.3和Capistrano 3.4.0。

我记得在我的应用程序中,我曾经插入过该行

config.force_ssl = true

在config / environments / production.rb中。我评论了这一点,希望我的应用程序能够重新使用http。但事实并非如此:即使在评论该行之后,每当我访问我的EC2公共IP(52.35.82.113)时,请求都会在端口80(http)上发送,并被重定向到端口443(https)。

当我在我返回的EC2实例上运行curl -v http://localhost时,可以更清楚地看到这一点:

* Rebuilt URL to: http://localhost/
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
* Server nginx/1.4.6 (Ubuntu) is not blacklisted
< Server: nginx/1.4.6 (Ubuntu)
< Date: Sat, 12 Dec 2015 12:22:56 GMT
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: keep-alive
< Location: https://localhost/
< 
* Connection #0 to host localhost left intact

对于这些东西,我不是很有经验。我认为最初的问题是我的Nginx配置,在我之前的问题here中,我建议我的Nginx配置没有任何问题,并且重定向来自Rails。我怀疑是这种情况,因为我在Nginx中看不到可以强制执行重定向的任何内容,但如果您认为问题可能存在,那么您可以在上面的链接中看到很多相关代码。

除了上面打印的force_ssl之外,Rails中的其他内容可能导致重定向?

谢谢大家的帮助。如果您有任何疑问或需要更多信息,请与我们联系!

答案

This gist建议可能是因为HSTS标题:

因此,如果您启用force_ssl一次,即使[if]您稍后将配置值更改为false,您之前用于打开[r]应用程序的浏览器仍会记住此网站(使用域名识别)[和]需要[您]使用HTTPS,并自动将您重定向到HTTPS连接。

根据this page,您可以通过访问Chrome中的chrome://net-internals/#hsts和Firefox中的about:permissions以及删除Safari中的~/Library/Cookies/HSTS.plist来删除您的HSTS条目。

另一答案

在Rails中,您可以使用配置文件强制站点范围的SSL(就像您正在做的那样),或者您可以选择哪些端点将使用SSL并在控制器级别使用force_ssl类方法。

也许你在你的application_controller.rb上使用过这种方法,或者哪个控制器正在为根路径服务而忘记它。你可以在Rails文档中找到这种机制的例子:http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html

force_ssl(options = {})链接强制请求到此特定控制器或指定的操作在HTTPS协议下。

如果您因任何原因需要禁用它(例如开发),那么您可以使用:if或:unless条件。

class AccountsController < ApplicationController
  force_ssl if: :ssl_configured?

  def ssl_configured?
    !Rails.env.development?
  end
end
另一答案

我之前尝试过在生产服务器上评论这一行并且它没有改变任何东西,所以不是评论只是将true更改为false,如:

config.force_ssl = false
另一答案

我也遇到过这个问题(rails + puma + nginx)。即使来自redirect_to,每个https都被送到http

vhost.conf有这条线:

proxy_set_header X-Forwarded-Proto https;

redirect_to在改变之后正常工作

proxy_set_header X-Forwarded-Proto http;
另一答案

我有同样的问题。我的解决方案是:

  1. 从aplication.rb中删除config.force_ssl = true
  2. 对于ubuntu Ctrl + Shift + Del =>清除浏览数据

以上是关于Rails:为什么我的服务器将http重定向到https的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 从 HTTP 重定向到 HTTPS

如何配置 Krakend 使其按原样返回 http 重定向响应而不是遵循 http 重定向?

Rails:使用参数重定向

HTTPS 重定向 Elastic Beanstalk 环境 Puma Rails 5

Rails:将所有未知路由重定向到 root_url

Rails 应用程序 HTTP 到 HTTPS 重定向不适用于公开的 API