2010-06-10 22 views
5

Tengo un servidor de aplicaciones Rails que está escuchando en el puerto 9000 y se está llamando a través de haproxy. Todos mis redireccionamientos desde ese servidor están siendo redirigidos a través del puerto 9000, cuando deberían enviarse de vuelta al puerto 80.Enviar redireccionamientos a puertos específicos

Estoy usando una combinación de haproxy + nginx + pasajero. ¿Hay alguna manera de asegurarse de que todos los redireccionamientos se envíen a través del puerto 80, independientemente de qué puerto esté escuchando el servidor real?

No me importa si es un haproxy, nginx, pasajero o rieles cambian. Solo necesito asegurarme de que la mayoría de las solicitudes, a menos que se especifique lo contrario, se envíen al puerto 80.

¡Gracias!

+0

¿Qué se está ejecutando en el puerto 9000? el haproxy deamon o nginx, y ¿por qué usas haproxy y nginx? – jigfox

+0

El daemon haproxy está en el puerto 80, y tengo instancias nginx ejecutándose en una variedad de puertos diferentes. – Garrett

Respuesta

11

Como se indicó elektronaut, esto es probablemente algo que debería manejarse en la configuración de su proxy. Dicho esto, ActiveSupport :: UrlFor # url_for tiene información que puede ser útil. Eche un vistazo a http://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/url_for.rb

Lo que creo que se reduce a pasar dos argumentos en sus llamadas url_for y/o link_to. En primer lugar es el argumento :port => 123, el segundo es :only_path => false para que genere el enlace completo que incluye dominio, puerto, etc.

Así que cuando se genera un enlace, se puede hacer:

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

y al crear una costumbre url que podría hacer:

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

Para una redirección:

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

Espero que esto ayude, y si no lo hace, puede ser más específico acerca de cómo genera sus URL, qué raíles está generando para usted y qué le gustaría que genere.

Actualización: yo no era consciente de esto, pero parece que se puede establecer valores predeterminados para los carriles de la URL genera con url_for, que es utilizado por todo lo que genera enlaces y/o direcciones URL.Hay una buena escritura en torno a ella aquí: http://lucastej.blogspot.com/2008/01/ruby-on-rails-how-to-set-urlfor.html

O para resumir para usted:

Agregar a su application_controler.rb

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

y esto:

helper_method :url_for 

El el primer bloque establece los valores predeterminados en los controladores, el segundo hace que el url_for helper use el que se encuentra en los controladores, por lo que los valores predeterminados se aplican también a eso.

+0

Acabo de enterarme de la configuración predeterminada de url_for. Actualicé esta publicación con toda la información. Es una solución mucho más limpia. –

2

Reescribiendo la redirección probablemente debería ser responsabilidad del servidor web, pero se puede cortar el objeto solicitud para siempre devuelven el puerto 80 en un 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

Esto puede funcionar, pero se siente como un golpe de clavo con un martillo gigante. También me pregunto si podría haber otros efectos secundarios al anular el método de puerto como lo ha demostrado. –

0

Si esto son enlaces que están relacionados con el mismo servidor que ubicar el sitio en el que se encuentran. Puede usar enlaces relativos en lugar de enlaces absolutos. Si está utilizando métodos de ayuda para crear los enlaces, puede usar el sufijo _path en lugar de _url.

Si su routes.rb se ve algo como esto:

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

o en los carriles 3:

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

puede utilizar los siguientes métodos de ayuda para crear enlaces relativos:

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 

Como puede ver, estos enlaces son independientes del puerto o host en el que se está ejecutando.

+0

Necesito el '_url' porque estoy generando una URL para que OpenID redirija a. Una vez que finaliza la redirección, el servidor piensa que está en el puerto: 9000. Tampoco tengo mucho control sobre la URL generada. – Garrett

1

Propongo que se debe reparar en haproxy agregando este código a la configuración.

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

Por supuesto, puede necesitar entradas de múltiples filas si está utilizando muchos puertos nginx/rails. – thomasfedb

+0

¿A dónde va exactamente esto? ¿Dentro de los bloques de back-end o los bloques frontend? – Garrett

+0

Por lo que puedo decir del manual de haproxy (no mucho) esto debería ir en back-end. Pero si eso tiene un problema, prueba con frontend. – thomasfedb

Cuestiones relacionadas