2010-06-10 135 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