2015-12-12 85 views
5

我有一个我在Heroku上构建的rails应用程序,我已经配置它在那里使用SSL。现在,我正在转向AWS EC2,并希望在没有SSL的情况下使用我的应用版本。一旦完成,我将在稍后添加SSL功能。Rails:为什么我的服务器将http重定向到https

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

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

config.force_ssl = true 
在配置/环境/ 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会导致重定向?

感谢您的帮助。如果您有任何疑问或需要更多信息,请告知我们!

+1

我猜你的nginx的配置,您已经做了力SSL。 – Emu

+0

你有没有重新启动你的Puma服务器? – Tobias

+0

嗨@Tobias。是的,我使用'ps'来查找进程ID并使用'kill -s SIGUSR2 ' – Dennis

回答

3

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

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

force_ssl(选项= {})链路组请求该特定 控制器或指定的动作是HTTPS协议下。

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

class AccountsController < ApplicationController 
    force_ssl if: :ssl_configured? 

    def ssl_configured? 
    !Rails.env.development? 
    end 
end 
+0

Hi @ alexandre-angelim,这是一个非常好的调用,但不幸的是,没有在我的应用程序控制器或服务于根路径的“主”控制器中没有这样的事情。我也尝试在我的配置/ routes.rb看,但没有什么会这样做 – Dennis

0

我尝试过评论在生产服务器此行并没有改变什么,而不是这样的评论只是改变时真亦假像:

config.force_ssl = false 
+0

@Dennis:你试过这个吗? –

+0

嗨@mar​​ouenB,这也是一个非常好的留言。我试过了,但它似乎没有改变任何东西。我觉得通常我的配置有很多错误,所以我无法确定。感谢您的建议 – Dennis

2

This gist表明,它可能是因为的一个HSTS头文件:

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

根据this page你可以在Firefox会在Chrome chrome://net-internals/#hstsabout:permissions和Safari中删除~/Library/Cookies/HSTS.plist删除您HSTS条目。

+1

这是我的确切问题,Chrome的解决方案(每个链接;考虑编辑您的答案,包括它)是去chrome:// net-internals /#hsts并从域中删除域HSTS。 –

+1

我添加了一些关于删除HSTS条目的说明。 – eremite

0

我有同样的问题。解决方法对我来说是:

  1. 从aplication.rb
  2. 删除config.force_ssl =真的Ubuntu 按Ctrl + Shift + Del键 =>清除浏览数据
0

我遇到这个问题(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; 
相关问题