2010-08-13 63 views
1

将SSL支持添加到我的网站后,我得到无限重定向循环。我正在使用“SslRequirement”插件。nginx + SslRequirement + mongrel cluster =无限重定向循环

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

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的操作中的重定向,似乎是问题。

任何线索?

回答

2

答案在这里找到:

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

短的版本是,我添加了以下行SSL虚拟主机在我的nginx的配置:

proxy_set_header X_FORWARDED_PROTO HTTPS;


详细版本是:

基本上问题下来到nginx的服务器未通过的事实,即源请求是到Mongrel的簇的HTTPS协议。这导致了对“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重新发出动作...

......你明白了。杂种群从不认为该请求是通过HTTPS协议的,所以它永远重定向。 nginx配置中的一个小改动来解决这个问题,并解决了BAM-O:问题。