重定向太多:乘客+ nginx SSLRequirement

时间:2013-05-15 14:10:27

标签: ruby-on-rails ssl nginx passenger ruby-on-rails-2

我有一个旧的rails 2.3应用程序,我正在转移到nginx + Passenger(来自Apache + Passenger)。 Nginx配置为SSL并且看起来运行正常,除了我被困在我的Rails应用程序的302重定向循环中。

rails app认为请求不是ssl(request.ssl?必须评估为false)。在production.log中,每个日志条目都将请求显示为http。如果我禁用SSLRequirement插件,那么重定向循环就会消失。但是,我想确保我的rails应用程序检测到https请求,以便在创建绝对URL时可以正确设置协议。

我提到之前的Apache + Passenger设置的唯一原因是SSLRequirement插件在该配置下正常运行。

我的虚拟主机的nginx配置如下所示:

server {
  listen       443 ssl;
  server_name  new.example.com;
  root /home/user/railsapps/example-setup/public;
  passenger_enabled on;
  ssl_certificate /etc/nginx/ssl/2013/example.com.chained.crt;
  ssl_certificate_key /etc/nginx/ssl/2013/example.key;
  ssl_protocols       SSLv3 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers         HIGH:!aNULL:!MD5;
}

3 个答案:

答案 0 :(得分:3)

如您所知,您的Rails应用程序不知道该请求是通过HTTPS完成的。根据{{​​3}},您需要设置:

proxy_set_header X-Forwarded-Proto $scheme;

让Nginx将方案传递给Rails

然而,他们将它设置在位置块中,而您似乎没有。

答案 1 :(得分:0)

答案在这里找到:

Error 310. Too many redirects with nginx + rails 3

我只需要将配置更改为以下内容:

server {
  listen 443;
  ssl on;
  server_name  new.usfamilytree.com;
  root /home/admin/railsapps/example-setup/public;
  passenger_enabled on;
  ssl_certificate /etc/nginx/ssl/2013/example.com.chained.crt;
  ssl_certificate_key /etc/nginx/ssl/2013/example.key;
  ssl_protocols       SSLv3 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers         HIGH:!aNULL:!MD5;
}

我删除了侦听行的ssl并添加了“ssl on”;线。

答案 2 :(得分:0)

@ Danack的答案不起作用,因为乘客不作为代理运行 - 它作为模块运行到nginx。相反,您可以使用passenger_set_cgi_param假冒任何http标头。

passenger_set_cgi_param HTTP_X_FORWARDED_PROTO $scheme;

我不知道X-Forwarded-Proto现在是否是rails的标准配置,但它在轨道4上自动与request.ssl?一起使用。

Docs here.