2010-06-10 105 views
5

我有一個Rails應用程序服務器正在監聽端口9000,並通過haproxy調用。我的所有重定向從該服務器被重定向回端口9000,當他們應該被送回端口80.發送重定向到特定端口

我使用haproxy + nginx +乘客的組合。有沒有辦法確保所有重定向都通過端口80發送,而不管實際服務器正在偵聽的端口是什麼?

我不在乎它的haproxy,nginx,Passenger或Rails是否改變。我只需要確保大多數請求,除非另有規定,都將發送回80端口。

謝謝!

+0

什麼在端口9000上運行? haproxy deamon或nginx,以及爲什麼要使用haproxy和nginx? – jigfox 2010-06-17 13:14:53

+0

haproxy守護進程在端口80上,並且我有nginx實例在各種不同的端口上運行。 – Garrett 2010-06-18 00:17:32

回答

11

就像elektronaut表示的那樣,這可能是您的代理配置中應該處理的事情。也就是說,ActiveSupport :: UrlFor#url_for有一些可能有用的信息。看看http://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/url_for.rb

我認爲它歸結爲傳遞兩個參數到您的url_for和/或link_to調用。首先是:port => 123參數,第二個是:only_path => false所以它生成的全鏈路,包括域名,端口等

因此產生一個鏈接時,你可能會做:

link_to 'test', root_url(:port => 80, :only_path => false) 

,並創建自定義的時候網址你可以這樣做:

url_for :controller => 'test', :action => 'index', :port => 80, :only_path => false 

對於重定向:

redirect_to root_url(:port => 80, :only_path => false) 

我希望這會有所幫助,如果沒有,您可以更具體地瞭解您如何生成您的URL,爲您生成的軌道以及您希望生成的內容。

更新: 我沒有意識到這一點,但似乎你可以設置URL的軌道默認與url_for,這是使用其他一切生成鏈接和/或URL生成。這是一個很好的寫了大約在這裏:http://lucastej.blogspot.com/2008/01/ruby-on-rails-how-to-set-urlfor.html

還是要總結一下你:

添加到您application_controler.rb

def default_url_options(options) 
    { :only_path => false, :port => 80 } 
end 

這:

helper_method :url_for 

的第一個模塊在控制器中設置默認值,第二個模塊會使url_for helper使用控制器中的默認值,因此默認值也適用於該控制器。

+0

我剛剛發現了有關設置url_for的默認設置。我已經更新了這篇文章的所有信息。這是一個更清潔的解決方案。 – 2010-06-19 21:27:43

2

重寫重定向可能應該是Web服務器的責任,但你能砍請求對象總是在的before_filter返回端口80:

class ApplicationController < ActionController::Base 
    before_filter :use_port_80 if RAILS_ENV == production 
    def use_port_80 
     class << request 
      def port; 80; end 
     end 
    end 
end
+0

這可能會起作用,但感覺非常像用巨型大錘敲打小釘子。我還想知道是否可能有其他副作用來替代您所示的端口方法。 – 2010-06-19 21:29:06

0

如果這是鏈接到同一服務器的鏈接網站上他們所在的網站。您可以使用相對鏈接而不是絕對鏈接。如果您使用助手方法創建鏈接,則可以使用_path後綴而不是_url

如果您routes.rb看起來是這樣的:

ActionController::Routing::Routes.draw do |map| 
    map.resources :users 
end 

或在軌道3:

YourAppName::Application.routes.draw do 
    resources :users 
end 

您可以使用下面的輔助方法來創建相關鏈接:

users_path  #=> /users 
user_path  #=> /users/:id 
edit_user_path #=> /users/:id/edit 
new_user_path #=> /users/new 

# instead of 

users_url  #=> http(s)://example.com:9000/users 
user_url  #=> http(s)://example.com:9000/users/:id 
edit_user_url #=> http(s)://example.com:9000/users/:id/edit 
new_user_url #=> http(s)://example.com:9000/users/new 

如您所見,這些鏈接獨立於您正在運行的端口或主機。

+0

我確實需要'_url',因爲我正在生成一個將OpenID重定向回來的URL。一旦重定向完成,服務器正在考慮它的端口:9000。我也沒有太多的控制生成的網址。 – Garrett 2010-06-18 00:16:55

1

我建議,應該通過將此代碼添加到配置固定在HAProxy的。

rsprep (.*):9000(.*) \1\2 
+0

當然,如果您使用的是多個nginx/rails端口,則可能需要多堆條目。 – thomasfedb 2010-06-19 14:42:13

+0

這究竟在哪裏呢?在後端塊或前端塊內? – Garrett 2010-06-19 15:54:14

+0

從我可以從haproxy手冊中知道(不是很多),這應該在後端。但如果有問題,請嘗試前端。 – thomasfedb 2010-06-19 16:43:36