在面向公众的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上了解了这个环境变量,所以这是一个为之工作的人,但是另外一个人说它不是另一个人所说的。所以根据我的经验,我们现在处于平局。我错过了什么吗?
答案 0 :(得分:1)
据我所知,能够直接使用ENV var在很久以前就已经改变了:
所以在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