2011-02-04 38 views
4

在我面向公众的Apache2服务器上获取我的Rails 3应用程序是通过子URI,像RoR3重定向不包括RAILS_RELATIVE_URL_ROOT

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

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

http://intranet.server.com/myapp 

在企业内部网服务器我的虚拟主机的设置我有

SetEnv RAILS_RELATIVE_URL_ROOT "/myapp" 

在我的配置/环境/ 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上了解到这个环境变量,所以这是一个人的工作,但另一个人声称它没有向另一个人表示它做了。所以凭借我的经验,我们现在处于平局。我错过了什么吗?

回答

0

我想通了我的错误。外部服务器上的反向代理设置仅引用了内部服务器的主机名,并且保留了我的RoR3应用程序的路径。

1

据我所知,能够使用的环境变量直接被前一段时间发生变化:

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

所以在environment.rb中(或初始化),你可以设置配置。 action_controller.relative_url_root = ENV ['RAILS_RELATIVE_URL_ROOT']

+0

我认为这是2.1到2.2的变化。在3.0版中(至少根据别人在这里其他地方的剪切和粘贴,Rails已经在做你已经建议的内容了),这就是为什么在我的情况下,记录器消息显示它是按照我期望的那样设置的,不幸的是我必须做的其他事情是撤消它,或者它真的没有工作 – tobinjim 2011-02-04 01:08:30

1

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

看来,我们需要做代理到确切的相对网址在目的地rails上:, 相同的匹配uri在Apache上。

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

下面这些例子已经过测试on Rails的4:

所以在代理的httpd。CONF:

将ProxyRequests关闭
ProxyPreserveHost在
<代理*>
订单拒绝,允许
所有
< /代理>

的ProxyPass/例如允许HTTP:// localhost:3000/示例

ProxyPassReverse/例如的http://本地主机:3000/例如

然后接下来,在导轨config.ru:

要求:: File.expand_path(” ../配置/环境”,FILE
#run Rails.application
地图的ActionController :: Base.config.relative_url_root做
运行Examplerails ::应用

图 “/” 做
运行Examplerails ::应用

最后,在配置/ application.rb中

模块Examplerails
class应用< Rails ::应用程序
config.action_controller.relative_url_root = “/ 例如

请密切注意,尾随/。
有些人有斜线而其他人不需要它。
也在上面的代码中删除标记和网址之间的一些间距,
即时尝试格式化它在这里显示。

0

我发现了Rails Github上这个线程有用:https://github.com/rails/rails/issues/5122

我终于实现了在配置/路径下(我通过RAILS_RELATIVE_URL_ROOT环境变量设置relative_url_root):

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