2013-05-15 76 views
1

我有一个旧的rails 2.3应用程序,我正在转移到nginx + Passenger(来自Apache + Passenger)。 Nginx配置为SSL并且似乎正常工作,除非我从Rails应用程序中陷入302重定向循环。太多的重定向:乘客+ nginx SSLRequirement

rails应用程序认为请求不是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

这是不相关到你的问题,但你似乎不设置任何标准的代理标题例如“proxy_set_header X-Real-IP $ remote_addr; proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for; proxy_set_header Host $ http_host;”不设置它们可能会产生“令人兴奋”的行为。 – Danack

回答

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;“线。

3

正如你猜你的Rails应用程序是不知道该请求是通过HTTPS完成。据to this page需要设置:

proxy_set_header X-Forwarded-Proto $scheme; 

为了让Nginx的穿过而计划到Rails

但是他们设置的位置块,你似乎没有一个。

+0

这就是我需要使它与独角兽一起工作的情况,因为在这种情况下,nginx充当代理。我认为这对乘客来说是不同的。 – Pierre

0

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

passenger_set_cgi_param HTTP_X_FORWARDED_PROTO $scheme; 

我不知道如果X转发 - 协议现在是铁轨的标准,但它与request.ssl?自动为我工作在轨道上4

Docs here.

+2

由于乘客5.0.1'passenger_set_cgi_param' [不再可用](https://blog.phusion.nl/2015/03/04/phusion-passenger-5-0-1-released/),并由' passenger_set_header'。 – jwadsack