我有一个我在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中的其他内容可能导致重定向?
感谢大家的帮助。如果您有任何疑问或需要更多信息,请与我们联系!
答案 0 :(得分:5)
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条目。
答案 1 :(得分:3)
在Rails中,您可以使用配置文件强制网站范围的SSL(就像您正在做的那样),或者您可以选择哪些端点将使用SSL并在控制器级别使用force_ssl
类方法。
也许您在application_controller.rb
上使用了该方法,或者哪个控制器正在为根路径服务而忘记了它。您可以在Rails文档中找到此类机制的示例:http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html
force_ssl(options = {})链接强制请求此特定 控制器或指定的操作在HTTPS协议下。
如果你因任何原因(例如开发)需要禁用它,那么你 可以使用:if或:除非条件。
class AccountsController < ApplicationController
force_ssl if: :ssl_configured?
def ssl_configured?
!Rails.env.development?
end
end
答案 2 :(得分:2)
之前我曾尝试在生产服务器中对此行进行评论,并且它没有更改任何内容,因此代替注释只是将true更改为false,如:
config.force_ssl = false
答案 3 :(得分:1)
我也遇到过这个问题(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;
答案 4 :(得分:0)
我遇到了同样的问题。我的解决方案是:
答案 5 :(得分:0)
就我而言,nginx config中的此设置是问题的原因
proxy_set_header X-Forwarded-Ssl on;
确保您的配置不包含相同的设置