Отправить перенаправления на определенные порты - PullRequest
5 голосов
/ 10 июня 2010

У меня есть сервер приложений Rails, который прослушивает порт 9000 и вызывается через haproxy. Все мои перенаправления с этого сервера перенаправляются обратно через порт 9000, когда они должны быть отправлены обратно на порт 80.

Я использую комбинацию haproxy + nginx + passenger. Есть ли способ убедиться, что все перенаправления отправляются через порт 80, независимо от того, какой порт прослушивает реальный сервер?

Мне все равно, если изменится haproxy, nginx, Passenger или Rails. Мне просто нужно убедиться, что большинство запросов, если не указано иное, отправляются обратно на порт 80.

Спасибо!

Ответы [ 4 ]

12 голосов
/ 19 июня 2010

Как указал 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 вы можете сделать:

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

Для перенаправления:

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

Надеюсь, это поможет, а если нет, можете ли вы более конкретно рассказать о том, как вы генерируете свои URL, что генерирует rails для вас, и что вы хотели бы, чтобы он генерировал.

Обновление: Я не знал об этом, но, кажется, вы можете установить значения по умолчанию для рельсов URL, генерируемых с помощью 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 использовать тот, который найден в контроллерах, поэтому значения по умолчанию применяются и к нему.

2 голосов
/ 15 июня 2010

Переписывание перенаправления, вероятно, должно быть обязанностью веб-сервера, но вы можете взломать объект запроса, чтобы всегда возвращать порт 80 в 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
1 голос
/ 19 июня 2010

Я предлагаю исправить это в haproxy, добавив этот код в конфиг.

rsprep (.*):9000(.*) \1\2
0 голосов
/ 17 июня 2010

Если это ссылки, которые связаны с тем же сервером, что и сайт, на котором они находятся.Вы можете использовать относительные ссылки вместо абсолютных.Если вы используете вспомогательные методы для создания ссылок, вы можете использовать суффикс _path вместо _url.

Если ваш routes.rb выглядит примерно так:

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

или в рельсах 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

Как видите, эти ссылки не зависят от порта или хоста, на котором вы работаете.

...