OmniAuth在反向代理设置中使用错误的回调端口

Rei*_*ior 5 apache port reverse-proxy ruby-on-rails omniauth

我有一个在端口上运行的Rails应用程序3101,我通过Apache反向代理设置将其提供给互联网(就像Phusion在此博客文章中建议的那样).

我正在使用Devise + OmniAuth来处理Facebook身份验证.

但是当我尝试通过Facebook进行身份验证时,我被重定向到了网址: http://mydomain.com:3101/my_callback_path

我启动rails应用程序,passenger start -a 127.0.0.1 -p 3101 -d我的Apache设置是:

<VirtualHost *:80>
    ServerName mydomain.com

    PassengerEnabled off
    ProxyPass / http://127.0.0.1:3101/
    ProxyPassReverse / http://127.0.0.1:3101

    ProxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
      Order deny,allow
      Allow from all
    </Proxy>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

我发现像一些答案,这个这个,但他们都打算Nginx的设置.

我试过使用初始化程序,OmniAuth.config.full_host = 'http://my domain.com'但我想知道我的apache设置中是否没有丢失配置(如前面的答案).

提前致谢.

wiz*_*wiz 12

我查看了OmniAuth源代码,发现回调机制在内部使用了一个名为full_host查找配置变量的方法然后构建URI的第一部分 - 看看oa-core-0.2.6/lib/omniauth/strategy.rb

配置变量可以是String(如您的情况),也可以是Proc或nil(或其他任何内容).在后一种情况下,请求URI被解析,切断和返回.

我认为我们不能通过在Apache中设置一个环境变量来解决我们的常见问题(这可能应该在较低级别,在ruby应用程序堆栈中完成),但经过一些实验后我发现这个工作得很好我:

OmniAuth.config.full_host = lambda do |env|
    scheme         = env['rack.url_scheme']
    local_host     = env['HTTP_HOST']
    forwarded_host = env['HTTP_X_FORWARDED_HOST']
    forwarded_host.blank? ? "#{scheme}://#{local_host}" : "#{scheme}://#{forwarded_host}"
end
Run Code Online (Sandbox Code Playgroud)