【问题标题】:RoR3 redirects not including RAILS_RELATIVE_URL_ROOTRoR3 重定向不包括 RAILS_RELATIVE_URL_ROOT
【发布时间】:2011-06-21 01:53:27
【问题描述】:

在我面向公众的 Apache2 服务器上,通过子 URI 访问我的 Rails 3 应用程序,例如

https://www.myserver.com/myapp/controller...

该服务器被配置为反向代理到另一个通过Passenger托管Rails应用程序的Apache2服务器:

http://intranet.server.com/myapp

在我的内网服务器的 VirtualHost 设置中

SetEnv RAILS_RELATIVE_URL_ROOT "/myapp"

在我的 config/environments/production.rb 文件中,我取消了该行的注释

config.log_level = :debug

这样,我的应用程序中的第一个执行方法就出问题了:

logger.debug { "The environment variable RAILS_RELATIVE_URL_ROOT is presently #{ENV['RAILS_RELATIVE_URL_ROOT']}" }

果然,在你看到的生产日志文件中:

The environment variable RAILS_RELATIVE_URL_ROOT is presently /myapp

然而,日志中的下一行是,这显然是浏览器去的:

Redirected to https://www.myserver.com/controller/action

我在 Stackoverflow 上了解了这个环境变量,所以这是对一个人有用的,但另一个人说它没有,另一个人说它有用。因此,根据我的经验,我们现在处于平局。我错过了什么吗?

【问题讨论】:

    标签: ruby-on-rails-3 apache2 passenger reverse-proxy


    【解决方案1】:

    据我所知,能够直接使用 ENV var 的功能在很久以前就发生了变化:

    https://rails.lighthouseapp.com/projects/8994/tickets/1946-setting-a-relative-root-url-via-a-web-server-not-possible-anymore

    所以在 environment.rb(或初始化程序)中,您可以设置 config.action_controller.relative_url_root = ENV['RAILS_RELATIVE_URL_ROOT']

    【讨论】:

    • 我认为这是从 2.1 到 2.2 的变化。在 3.0 中(至少根据某人对此处其他地方的源代码的剪切和粘贴,Rails 正在执行您已经建议的操作。这就是为什么在我的情况下,记录器消息显示它已按我的预期设置。不幸的是,我必须做的其他事情正在撤消它,或者它真的还没有工作。
    • 我确实看过灯塔票。只是为了笑,然后我添加了一条 logger.debug 消息来报告该值。您得到的是 nag 消息:弃用警告:ActionController::Base.relative_url_root 无效。请停止使用。我正在使用 Rails 3.0.3
    【解决方案2】:

    哇,非常感谢, 我终于弄明白了。

    似乎我们需要对目标 rails 上的确切 relative url 进行代理:, apache 上相同的匹配 uri。

    eg: http://localhost/example/ to http://localhost:3000/example/

    以下这些示例已在 Rails 4 上进行了测试:

    所以在代理 httpd.conf 中:

    ProxyRequests 关闭
    ProxyPreserveHost 开启

    订单拒绝,允许
    全部允许
    代理>

    ProxyPass /示例 http://localhost:3000/示例

    ProxyPassReverse /示例 http://localhost:3000/示例

    接下来,在 rails config.ru 中:

    需要 ::File.expand_path('../config/environment', FILE)
    #run Rails.application
    映射 ActionController::Base.config.relative_url_root 做
    运行 Examplerails::Application
    结束

    映射“/”做
    运行 Examplerails::Application
    结束

    最后,在 config/application.rb 中

    模块 Examplerails
    类应用程序 config.action_controller.relative_url_root = "/示例"
    结束
    结束

    请注意尾随 /。
    有些有斜杠,而另一些则不需要。
    还要在上面的代码中删除标签和 url 之间的一些间距,
    我试图将其格式化以显示在这里。

    【讨论】:

      【解决方案3】:

      我发现了我的错误。外部服务器上的反向代理设置仅引用了内部服务器的主机名,并没有指向我的 RoR3 应用程序的路径。

      【讨论】:

        【解决方案4】:

        我发现 Rails Github 上的这个帖子很有用:https://github.com/rails/rails/issues/5122

        我最终在 config/routes 中执行了以下操作(我通过 RAILS_RELATIVE_URL_ROOT 环境变量配置了 relative_url_root):

        Rails.application.routes.draw do |*args|
          scope Rails.application.config.relative_url_root || "/" do
            ...
          end
        end
        

        【讨论】:

          猜你喜欢
          • 2011-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-22
          • 1970-01-01
          • 1970-01-01
          • 2021-12-11
          • 2017-06-09
          相关资源
          最近更新 更多