我有一个旧的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;
}
答案 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?
一起使用。