Rails与代理重定向

时间:2014-02-19 10:04:20

标签: ruby-on-rails node.js nginx devise proxy

我配置了grunt-connect-proxy(实际上是基于http-node-proxy)将localhost:3000上的请求代理到托管myserver.com的后端。

后端应用程序在Nginx(+ nginx乘客模块)+乘客上运行。这里没有反向代理。

nginx配置如下:

server {
    listen 80 default_server;

    root  /home/deployer/app/current/public;
    passenger_enabled on;

    access_log /var/log/nginx/app.access.log;

    if (-f $document_root/system/maintenance.html){
        rewrite ^(.*)$ /system/maintenance.html;
        break;
    }

   location ~* ^/assets/  {
      try_files $uri 404;
   }

    location ~* ^.+.(css|js|jpeg|jpg|gif|png|ico)$ {
        expires 30d;
    }

    location /nginx_status {
       stub_status on;
       access_log   off;
       allow 127.0.0.1;
       deny all;
    }
}

它实际上就像这里描述的那样: https://www.digitalocean.com/community/articles/how-to-install-rails-and-nginx-with-passenger-on-ubuntu

第一个请求没问题:当我输入localhost:3000时,我实际上是在myserver.com上。 HTTP代码= 200。

当我尝试访问受保护的页面(使用Devise)时,让我们说http://localhost:3000/admin/articles,我得到一个HTTP代码= 302,但我被重定向到myserver.com

这意味着:我可以登录myserver.com但不能登录localhost:3000

如何告诉Rails或Devise考虑代理地址?

2 个答案:

答案 0 :(得分:0)

您没有提供任何配置数据,但我认为您的问题是您没有设置proxy_redirect

在包含proxy_pass

的同一块中添加此行
proxy_redirect default;

答案 1 :(得分:0)

线索在这里:https://github.com/rack/rack/blob/master/lib/rack/request.rb#L88

我必须发送HTTP_X_FORWARDED_HOST标头,其值为localhost:3000。 然后,它是grunt代理,你会有类似的东西:

        {
          context: ['/'],
          host: 'myserver.com',
          port: 80,
          https: false,
          changeOrigin: true,
          xforward: true,
          headers: {
            'x-forwarded-host': 'localhost:3000'
          }
        }