2012-04-30 39 views
2

我正在從Passenger遷移到Unicorn,並且我用RailsBaseURI選項運行我的Rails 3.0應用程序,以「/ blah」爲例給所有URL加上前綴。當我在Unicorn下運行相同的應用程序時,我將'-path/blah'傳遞給unicorn_rails,但服務器仍然服務於http://server:3000/etc/etc,而不是http://server:3000/blah/etc/etc - 我看到一些資源通過/ blah /(如JS文件等),但各種鏈接仍然沒有「/ blah /」。如何讓獨角獸在路徑下運行Rails 3.0應用程序?

因此 - 總結 - 如何讓Unicorn在/ blah下掛載我的應用程序,以便所有請求都使用前綴爲'/ blah'的路徑,並且所有鏈接和資產都使用前綴'/ blah /'創建給他們?

感謝

回答

4

這裏就是我發現:

爲了得到一個Rails應用程序服務資產和鏈接的URL,你必須設置一個環境變量之前啓動:

ENV['RAILS_RELATIVE_URL_ROOT'] = '/prefix' 

隨後,@ d11wtq說,要獲得機架兼容服務器(在這種情況下,麒麟)實際上起到一個前綴下的應用程序,你個人有T O,在config.ru文件,而不是通常的運行路線,做到以下幾點:

run Rack::URLMap.new(
    ENV['RAILS_RELATIVE_URL_ROOT'] => Rails.application 
) 
3

我相信把這樣的事情在你的config.ru應該這樣做:

require ::File.expand_path('../config/environment', __FILE__) 

run Rack::URLMap.new(
    "/blah" => Rails.application 
) 

未經檢驗

+0

嗯......我不希望發展一個不同的配置(如無人目前使用的前綴)和部署...但我想我可以做一個單獨的config.ru供Unicorn使用。我會立即嘗試,謝謝。 –

+1

嗯....發送unicorn_rails一個--path標誌會導致資產鏈接爲/ blah/etc/etc,但其他鏈接和請求本身仍然通過/提供。您的解決方案是相反的 - 鏈接和應用程序本身現在從/ blah提供服務,但資產仍然從/服務。所以我做了兩個 - 它的工作!如果每個人都有一個,我仍然會喜歡一種更優雅的方式 - 這種方式一舉兩得,這就是問題的要求。 –

+0

此解決方案可能不適用於由您的前端直接提供的靜態資產。 –

1

最簡單和可靠的解決方案是設置前綴您前端設置。

客運+ nginx的,例如,你可以使用這樣的事情:

server { 
    listen 80; 
    server_name www.phusion.nl; 
    root /websites/phusion; 
    passenger_enabled on; 
    passenger_base_uri /prefix; 
} 

沒有在源代碼改變,一個線設置。


但是你說你使用的是unicorn,你使用哪種前端?

使用nginx的是有可能需要這樣的:

location /prefix { 
    rewrite   ^/prefix/(.*) /$1  break; 
    proxy_pass  http://localhost:8000; 
} 
+1

不幸的是,這將無法正常工作,因爲沒有我想要的前綴生成的鏈接。換句話說,這些鏈接不會有/前綴/前綴給他們,因此不起作用。我需要應用程序來生成與/ prefix /的鏈接。 –

相關問題