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

标签 ruby-on-rails apache port omniauth reverse-proxy

我在端口 3101 上运行了一个 Rails 应用程序我通过 Apache 反向代理设置(就像 Phusion 在 this blog post 上建议的那样)将它提供给互联网。

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

但是当我尝试通过 Facebook 进行身份验证时,我被重定向到以下网址:http://mydomain.com:3101/my_callback_path
我用 passenger start -a 127.0.0.1 -p 3101 -d 启动 rails 应用程序我的 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>

我找到了一些答案,例如 thisthis但它们都是针对 Nginx 设置的。

我尝试将初始化程序与 OmniAuth.config.full_host = 'http://my domain.com' 一起使用但我想知道我的 apache 设置中是否没有缺少配置(如之前的答案)。

提前致谢。

最佳答案

我查看了OmniAuth源,发现回调机制内部使用了一个名为full_host的方法。查找配置变量,然后构建 URI 的第一部分 - 查看 oa-core-0.2.6/lib/omniauth/strategy.rb
配置变量可以是一个字符串(如您的情况)、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

关于ruby-on-rails - OmniAuth 在反向代理设置中使用错误的回调端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6803307/

相关文章:

ruby-on-rails - 如何从 Rails 引擎在开发组中添加 gem?

django - 在 Django 站点中保护静态媒体访问

apache - 如何为 Apache 2.2 启用 mod_rewrite

ruby-on-rails - 寻找在 Ruby on Rails 中构建安全 REST API 的建议

ruby-on-rails - Rails after_find 回调用法

linux - 设置虚拟主机文件以托管来自远程服务器的源代码

postgresql升级备份和恢复相同端口

networking - 在 docker 中使用 netcat 通信两个容器

c - 选择TCP层发送数据的端口

ruby-on-rails - 通过 Regex、Ruby 拆分时保留模式字符