1

我有一个旧的 rails 2.3 应用程序,我正在迁移到 nginx+Passenger(来自 Apache+Passenger)。Nginx 已针对 SSL 进行了配置,并且似乎运行正常,但我在 Rails 应用程序中陷入了 302 重定向循环。

rails 应用程序认为请求不是 ssl(request.ssl?必须评估为假)。在 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;
}
4

3 回答 3

3

正如您所猜测的那样,您的 Rails 应用程序不知道请求是通过 HTTPS 完成的。根据此页面您需要设置:

proxy_set_header X-Forwarded-Proto $scheme;

让 Nginx 将方案传递给 Rails

但是,他们将其设置在位置块中,而您似乎没有。

于 2013-05-15T14:18:55.923 回答
0

@Danack 的答案不起作用,因为乘客不作为代理运行 - 它作为 nginx 的模块运行。相反,您可以使用passenger_set_cgi_param.

passenger_set_cgi_param HTTP_X_FORWARDED_PROTO $scheme;

我不知道 X-Forwarded-Proto 现在是否是 rails 的标准配置,但它request.ssl?在 rails 4 上自动为我工作。

文档在这里。

于 2013-08-20T09:33:13.880 回答
0

答案在这里找到:

错误 310。使用 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”;线。

于 2013-05-16T11:50:26.373 回答