RoR3重定向不包括RAILS_RELATIVE_URL_ROOT

时间:2011-02-04 00:54:45

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

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

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

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

http://intranet.server.com/myapp

在我的Intranet服务器的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上了解了这个环境变量,所以这是一个为之工作的人,但是另外一个人说它不是另一个人所说的。所以根据我的经验,我们现在处于平局。我错过了什么吗?

4 个答案:

答案 0 :(得分: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']

答案 1 :(得分:1)

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

似乎我们需要代理到目标路径上的确切相对网址: 与apache相同的匹配uri。

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

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

所以在代理httpd.conf中:

  

ProxyRequests Off      ProxyPreserveHost On      <代理*>
     命令拒绝,允许
     允许所有人      < /代理>

     

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

     

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

接下来,在rails config.ru:

  

require :: File.expand_path(' ../ config / environment', FILE
     #run Rails.application
     map ActionController :: Base.config.relative_url_root做
       运行 Examplerails ::应用程序
     结束

     

map" /"做
       运行Examplerails :: Application
     结束

最后,在config / application.rb

  

模块示例栏杆
       class Application<轨道::应用
       config.action_controller.relative_url_root =" / 示例"
       结束
     结束

请密切注意尾随/。
有些人拖着斜线,有些则不需要它 同时在上面的代码中删除标记和网址之间的一些间距,
我试图格式化它在这里显示。

答案 2 :(得分:0)

我弄清楚了我的错误。外部服务器上的反向代理设置仅引用内部服务器的主机名,并且不在我的RoR3应用程序的路径中。

答案 3 :(得分:0)

我发现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