Отправьте перенаправления в определенные порты

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

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

Я не забочусь, является ли это haproxy, nginx, Пассажир или изменение направляющих. Я просто должен удостовериться большинство запросов, если не указано иначе, переданы обратно для портирования 80.

Спасибо!

5
задан jigfox 17 June 2010 в 13:12
поделиться

4 ответа

Как указывал 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-адресов, какие рельсы генерируются для вас и что вы хотите, чтобы они генерировались.

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

12
ответ дан 18 December 2019 в 11:53
поделиться

Перезапись перенаправления, вероятно, должна быть ответственностью веб-сервера, но вы можете взломать объект запроса, чтобы всегда возвращать порт 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
2
ответ дан 18 December 2019 в 11:53
поделиться

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

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

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

или в rails 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

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

0
ответ дан 18 December 2019 в 11:53
поделиться

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

rsprep (.*):9000(.*) \1\2
1
ответ дан 18 December 2019 в 11:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: