我有一個Rails應用程序服務器正在監聽端口9000,並通過haproxy調用。我的所有重定向從該服務器被重定向回端口9000,當他們應該被送回端口80.發送重定向到特定端口
我使用haproxy + nginx +乘客的組合。有沒有辦法確保所有重定向都通過端口80發送,而不管實際服務器正在偵聽的端口是什麼?
我不在乎它的haproxy,nginx,Passenger或Rails是否改變。我只需要確保大多數請求,除非另有規定,都將發送回80端口。
謝謝!
我有一個Rails應用程序服務器正在監聽端口9000,並通過haproxy調用。我的所有重定向從該服務器被重定向回端口9000,當他們應該被送回端口80.發送重定向到特定端口
我使用haproxy + nginx +乘客的組合。有沒有辦法確保所有重定向都通過端口80發送,而不管實際服務器正在偵聽的端口是什麼?
我不在乎它的haproxy,nginx,Passenger或Rails是否改變。我只需要確保大多數請求,除非另有規定,都將發送回80端口。
謝謝!
就像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使用控制器中的默認值,因此默認值也適用於該控制器。
我剛剛發現了有關設置url_for的默認設置。我已經更新了這篇文章的所有信息。這是一個更清潔的解決方案。 – 2010-06-19 21:27:43
重寫重定向可能應該是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
這可能會起作用,但感覺非常像用巨型大錘敲打小釘子。我還想知道是否可能有其他副作用來替代您所示的端口方法。 – 2010-06-19 21:29:06
如果這是鏈接到同一服務器的鏈接網站上他們所在的網站。您可以使用相對鏈接而不是絕對鏈接。如果您使用助手方法創建鏈接,則可以使用_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
如您所見,這些鏈接獨立於您正在運行的端口或主機。
我確實需要'_url',因爲我正在生成一個將OpenID重定向回來的URL。一旦重定向完成,服務器正在考慮它的端口:9000。我也沒有太多的控制生成的網址。 – Garrett 2010-06-18 00:16:55
我建議,應該通過將此代碼添加到配置固定在HAProxy的。
rsprep (.*):9000(.*) \1\2
當然,如果您使用的是多個nginx/rails端口,則可能需要多堆條目。 – thomasfedb 2010-06-19 14:42:13
這究竟在哪裏呢?在後端塊或前端塊內? – Garrett 2010-06-19 15:54:14
從我可以從haproxy手冊中知道(不是很多),這應該在後端。但如果有問題,請嘗試前端。 – thomasfedb 2010-06-19 16:43:36
什麼在端口9000上運行? haproxy deamon或nginx,以及爲什麼要使用haproxy和nginx? – jigfox 2010-06-17 13:14:53
haproxy守護進程在端口80上,並且我有nginx實例在各種不同的端口上運行。 – Garrett 2010-06-18 00:17:32