nginx + SslRequirement + mongrel cluster =无限重定向循环

时间:2010-08-13 19:11:19

标签: ssl nginx mongrel-cluster

在向我的网站添加SSL支持后,我获得了无限重定向循环。我正在使用“SslRequirement”插件。

我看到的症状是,任何启用了“ssl_required”的操作,以及我手动键入的前面有https的任何URL都会进入无限循环,并在development.log文件中包含以下内容:一遍又一遍,直到浏览器捕获重定向循环并停止加载页面(“/ admins / index”是此示例中的操作,但它会在任何操作时发生):

Processing AdminsController#index (for 127.0.0.1 at 2010-08-13 13:50:16) [GET]
  Parameters: {"action"=>"index", "controller"=>"admins"}
Redirected to https://localhost/admins
Filter chain halted as [:ensure_proper_protocol] rendered_or_redirected.
Completed in 0ms (DB: 0) | 302 Found [http://localhost/admins]

起初我觉得有一些问题,我必须让我的所有行为“ssl_allowed” - 所以我试过了,但无济于事。

如果我删除SslRequirement的使用,并删除任何“ssl_required / ssl_allowed”引用,那么https工作正常 - 所以这是从http到https的操作中的重定向似乎是问题。

任何线索?

1 个答案:

答案 0 :(得分:2)

在此处找到答案:

http://www.hostingrails.com/SSL-Redirecting-not-working

简短版本是,我将以下行添加到我的nginx配置中的SSL vhost:

proxy_set_header X_FORWARDED_PROTO https;


详细版本是:

基本上问题归结为nginx服务器没有将源请求作为HTTPS协议传递给Mongrel集群。这导致调用“request.ssl?”在SslRequirement插件中,总是返回false。

因此,当这返回为false时,“ensure_proper_protocol”将通过https重新发出操作,这将检查“request.ssl?”,这将返回“false”,这将通过https重新发出操作,它将检查“request.ssl?”,这将返回“false”,这将通过https重新发出操作,这将检查“request.ssl?”,这将返回“false”,这将重新发出对https的操作,会检查“request.ssl?”,这将返回“false”,这将通过https重新发布操作...

...你明白了。 mongrel集群从未认为该请求是通过HTTPS协议的,因此它永远重定向。 nginx配置中的一个小变化来纠正这个问题,BAM-O:问题解决了。