将重定向发送到特定端口

时间:2010-06-10 04:50:27

标签: ruby-on-rails nginx passenger haproxy

我有一个正在侦听端口9000的Rails应用服务器,并且正在通过haproxy调用。来自该服务器的所有重定向都将通过端口9000重定向回来,当它们应该在端口80上发回时。

我正在使用haproxy + nginx +乘客的组合。有没有办法确保所有重定向都通过端口80发送,无论实际服务器正在侦听哪个端口?

我不在乎它的haproxy,nginx,Passenger或Rails是否会发生变化。除非另有说明,否则我只需要确保大多数请求都被发送回端口80。

谢谢!

4 个答案:

答案 0 :(得分:12)

就像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的rails生成的默认值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帮助器使用控制器中找到的默认值,因此默认值也适用于控制器。

答案 1 :(得分: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

答案 2 :(得分:1)

我建议通过在配置中添加此代码来修复haproxy。

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

答案 3 :(得分:0)

如果这是链接到与他们所在站点的站点相同的服务器的链接。您可以使用相对链接而不是绝对链接。如果您使用辅助方法创建链接,则可以使用_path后缀而不是_url

如果您的routes.rb看起来像这样:

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

或在rails 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

如您所见,这些链接独立于您正在运行的端口或主机。