2011-02-04 55 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