2010-06-10 26 views
5

Mam serwer aplikacji Rails, który nasłuchuje na porcie 9000 i jest wywoływany przez haproxy. Wszystkie moje przekierowania z tego serwera są przekierowywane z powrotem przez port 9000, kiedy powinny zostać wysłane z powrotem na port 80.Wysyłaj przekierowania do określonych portów

Używam kombinacji haproxy + nginx + pasażera. Czy istnieje sposób, aby upewnić się, że wszystkie przekierowania są wysyłane przez port 80, bez względu na port, którego nasłuchuje rzeczywisty serwer?

Nie obchodzi mnie, czy zmieni się jego haproxy, nginx, Passenger lub Rails. Muszę się upewnić, że większość próśb, o ile nie określono inaczej, zostanie odesłanych do portu 80.

Dzięki!

+0

co działa na porcie 9000? haproxy deamon lub nginx, i dlaczego używasz haproxy i nginx? – jigfox

+0

Demon haproxy znajduje się na porcie 80, a ja mam instancje nginx działające na różnych portach. – Garrett

Odpowiedz

11
Jak wskazał elektronaut, jest to prawdopodobnie coś, co powinno być obsługiwane w konfiguracji serwera proxy. Powiedział, że ActiveSupport :: UrlFor # url_for ma pewne informacje, które mogą być przydatne. Spójrz na http://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/url_for.rb

Co myślę, że sprowadza się do przekazywania dwóch argumentów do twoich połączeń url_for i/lub link_to. Pierwszym z nich jest :port => 123 argument drugi :only_path => false tak, że generuje pełny link w tym domeny, portu itp

więc podczas generowania linku, można zrobić:

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

i podczas tworzenia niestandardowego URL może zrobić:

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

Dla przekierowania:

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

Mam nadzieję, że to pomoże, a jeśli nie, możesz dokładniej opisać, jak generujesz adresy URL, jakie tory generują dla ciebie i co chcesz wygenerować.

Aktualizacja: nie byłem tego świadomy, ale wydaje się, można ustawić domyślne dla szyn adres URL generuje z url_for, który jest używany przez wszystko inne, co generuje linki i/lub adresów URL.Jest dobry napisać o tym tutaj: http://lucastej.blogspot.com/2008/01/ruby-on-rails-how-to-set-urlfor.html

Albo Podsumowując dla ciebie:

Dodaj to do swojej application_controler.rb

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

a to:

helper_method :url_for 

pierwszy blok ustawia domyślne ustawienia w kontrolerach, a drugi powoduje, że pomocnik url_for używa tego, który znajduje się w kontrolerach, więc wartości domyślne również odnoszą się do tego kontrolera.

+0

Właśnie dowiedziałem się o ustawianiu wartości domyślnych dla url_for. Zaktualizowałem ten wpis wszystkimi informacjami. To znacznie czystsze rozwiązanie. –

2

Przepisanie przekierowanie prawdopodobnie powinien być odpowiedzialny serwer sieci Web, ale można siekać obiektu żądania, aby zawsze powrócić portu 80 w before_filter:

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

To może zadziałać, ale to bardzo przypomina jazdę małym gwoździem z ogromnym młotem kowalskim. Zastanawiam się również, czy mogą wystąpić inne efekty uboczne, które mogą przesłonić metodę portu, tak jak to pokazano. –

0

Jeśli to są linki, które są związane z tym samym serwerze, wyświetl witrynę, na której się znajdują. Możesz użyć względnych linków zamiast bezwzględnych. Jeśli używasz metod pomocnika do utworzenia linków, możesz użyć przyrostka _path zamiast _url.

Jeśli routes.rb wygląda mniej więcej tak:

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

lub w szynach 3:

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

można użyć następujących metod pomocniczych do tworzenia względne linki:

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 

Jak widać, te linki są niezależne od portu lub hosta, na którym pracujesz.

+0

Potrzebuję '_url', ponieważ generuję adres URL, do którego ponownie należy przekierować OpenID. Po zakończeniu przekierowania serwer myśli o porcie: 9000. Nie mam też dużej kontroli nad wygenerowanym adresem URL. – Garrett

1

Proponuję, żeby to zostało naprawione w haproxy przez dodanie tego kodu do config.

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

Oczywiście możesz potrzebować wpisów na wielu stosach, jeśli używasz wielu portów nginx/rails. – thomasfedb

+0

Gdzie dokładnie to się dzieje? W ramach bloków backendu lub bloków frontendu? – Garrett

+0

Z tego, co mogę powiedzieć z podręcznika haproxy (nie wiele), powinno to iść w backend. Ale jeśli to ma problem, spróbuj zastosować frontend. – thomasfedb

Powiązane problemy