Pergunta

Eu tenho um servidor de aplicativos Rails que está ouvindo na porta 9000 e está sendo chamado através do Haproxy. Todos os meus redirecionamentos desse servidor estão sendo redirecionados de volta pela porta 9000, quando devem ser enviados de volta na porta 80.

Estou usando uma combinação de Haproxy + Nginx + passageiro. Existe uma maneira de garantir que todos os redirecionamentos estejam sendo enviados pela porta 80, independentemente da porta em que o servidor real esteja ouvindo?

Não me importo se é um haproxy, nginx, passageiro ou trilhos mudam. Eu só preciso garantir que a maioria das solicitações, a menos que especificada de outra forma, seja enviada de volta à porta 80.

Obrigado!

Foi útil?

Solução

Como Elektronaut indicou, isso provavelmente é algo que deve ser tratado na configuração do seu proxy. Dito isto, o ActiveSupport :: urlfor#url_for tem algumas informações que podem ser úteis. Dar uma olhada em http://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/url_for.rb

O que eu acho que se resume é passar dois argumentos para as chamadas url_for e/ou link_to. Primeiro é o :port => 123 argumento, o segundo é :only_path => false para que gera o link completo, incluindo domínio, porta, etc.

Então, ao gerar um link, você pode fazer:

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

E ao criar um URL personalizado que você pode fazer:

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

Para um redirecionamento:

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

Espero que isso ajude e, se não o fizer, você pode ser mais específico sobre como gerar seus URLs, o que o Rails está gerando para você e o que você gostaria que ele gerasse.

Atualizar:Eu não estava ciente disso, mas parece que você pode definir padrões para os trilhos do URL gera com o URL_FOR, que é usado por tudo o mais que gera links e/ou URLs. Há uma boa redação sobre isso aqui: http://lucostej.blogspot.com/2008/01/ruby-on-rails-how-to-set-urlfor.html

Ou resumir para você:

Adicione isso ao seu application_controler.rb

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

e isto:

helper_method :url_for

O primeiro bloco define os padrões nos controladores, o segundo faz com que o URL_FOR HINGER use o encontrado nos controladores; portanto, os padrões se aplicam a isso também.

Outras dicas

Reescrever o redirecionamento provavelmente deve ser de responsabilidade do servidor da web, mas você pode invadir o objeto de solicitação para sempre retornar a porta 80 em um antes_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

Proponho que ele deve ser corrigido no Haproxy, adicionando este código à configuração.

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

Se esses são links vinculados ao mesmo servidor que o site em que estão. Você pode usar links relativos em vez de absolutos. Se você estiver usando métodos auxiliares para criar os links, você pode usar o _path sufixo em vez de _url.

Se seu routes.rb Parece algo assim:

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

ou no Rails 3:

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

Você pode usar os seguintes métodos auxiliares para criar links 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 você pode ver, esses links são independentes da porta ou do host em que você está executando.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top