2010-06-10 10 views
5

Ich habe einen Rails-Anwendungsserver, der Port 9000 überwacht und über haproxy aufgerufen wird. Alle meine Weiterleitungen von diesem Server werden zurück über Port 9000 umgeleitet, wenn sie an Port 80 zurückgeschickt werden sollten.Redirects an bestimmte Ports senden

Ich verwende eine Kombination aus haproxy + nginx + Passagier. Gibt es eine Möglichkeit, sicherzustellen, dass alle Weiterleitungen über Port 80 gesendet werden, unabhängig davon, auf welchem ​​Port der tatsächliche Server überwacht wird?

Es ist mir egal, ob es ein haproxy, nginx, Passagier oder Schienen ändern. Ich muss nur sicherstellen, dass die meisten Anfragen, wenn nicht anders angegeben, zurück an Port 80 gesendet werden.

Vielen Dank!

+0

was läuft auf Port 9000? die Haproxy Deamon oder Nginx, und warum verwenden Sie Haproxy und Nginx? – jigfox

+0

Der haproxy-Daemon befindet sich auf Port 80, und ich habe nginx-Instanzen, die auf verschiedenen Ports laufen. – Garrett

Antwort

11

Wie von elektronaut angegeben, ist dies wahrscheinlich etwas, das in der Proxy-Konfiguration behandelt werden sollte. Das heißt, ActiveSupport :: UrlFor # url_for hat einige Informationen, die nützlich sein könnten. Werfen Sie einen Blick auf http://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/url_for.rb

Was ich denke, es läuft auf zwei Argumente in Ihre URL_for und/oder Link_to Anrufe übergeben. Erstens ist das :port => 123 Argument ist die zweite :only_path => false, so dass es den vollständigen Link einschließlich Domain, Port erzeugt usw.

Also, wenn Sie einen Link zu erzeugen, könnten Sie tun:

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

und wenn eine benutzerdefinierte Erstellung url Sie tun könnte:

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

Für eine Umleitung:

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

Ich hoffe, dies hilft, und wenn nicht, können Sie genauer bestimmen, wie Sie Ihre URLs generieren, welche Rails für Sie generieren und was Sie generieren möchten.

Update: war ich nicht bewusst, aber es scheint, dass Sie Standardwerte für die URL der Schienen erzeugt mit url_for gesetzt, die durch alles andere verwendet wird, die Links und/oder URLs erzeugt.Es gibt eine gute aufzuschreiben darüber hier: http://lucastej.blogspot.com/2008/01/ruby-on-rails-how-to-set-urlfor.html

Oder es für Sie zusammenzufassen:

Fügen Sie diese auf Ihre application_controler.rb

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

und diese:

helper_method :url_for 

Die Der erste Block setzt die Standardwerte in den Controllern, der zweite bewirkt, dass der Helfer url_for den in den Controllern gefundenen verwendet, so dass auch die Standardeinstellungen darauf angewendet werden.

+0

Ich habe gerade über die Einstellung von Standardeinstellungen für url_for erfahren. Ich habe diesen Beitrag mit allen Informationen aktualisiert. Es ist eine viel sauberere Lösung. –

2

Umschreiben der Umleitung sollte wohl in der Verantwortung des Webservers sein, aber man kann das Request-Objekt hacken immer Port 80 in einem before_filter zurück:

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

Das mag funktionieren, aber es fühlt sich an wie ein kleiner Nagel mit einem riesigen Vorschlaghammer. Ich frage mich auch, ob es andere Nebenwirkungen geben könnte, die Port-Methode zu überschreiben, wie Sie gezeigt haben. –

0

Wenn dies sind Links, die zu dem gleichen Server verbunden sind Website der Website, auf der sie sich befinden. Sie können relative statt absolute Links verwenden. Wenn Sie Hilfsmethoden verwenden, um die Verknüpfungen zu erstellen, können Sie das _path-Suffix anstelle von _url verwenden.

Wenn Ihr routes.rb etwas wie folgt aussieht:

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

oder in Schienen 3:

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

Sie die folgenden Hilfsmethoden verwenden können relative Verknüpfungen zu erstellen:

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 

Wie Sie sehen können, sind diese Links unabhängig von dem Port oder Host, auf dem Sie laufen.

+0

Ich brauche die '_url', weil ich eine URL erzeuge, um OpenID Redirect zurück zu haben. Sobald die Weiterleitung abgeschlossen ist, denkt der Server an Port: 9000. Ich habe auch nicht viel Kontrolle über die generierte URL. – Garrett

1

Ich schlage vor, es sollte in haproxy behoben werden, indem dieser Code der Config hinzugefügt wird.

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

Natürlich benötigen Sie möglicherweise mehrere Einträge, wenn Sie viele nginx/rails-Ports verwenden. – thomasfedb

+0

Wohin genau geht das? Innerhalb der Backend-Blöcke oder der Frontend-Blöcke? – Garrett

+0

Von was ich aus dem Haproxy-Handbuch (nicht viel) sagen kann, sollte dies im Backend gehen. Aber wenn das Problem hat, dann versuchen Sie Frontend. – thomasfedb

Verwandte Themen