У меня есть сервер приложений направляющих, который слушает на порте 9000 и называется через haproxy. Все мои перенаправления с того сервера перенаправляются назад через порт 9000, когда их нужно передать обратно на порте 80.
Я использую комбинацию haproxy + nginx + пассажир. Существует ли способ удостовериться, что все перенаправления отправляются через порт 80, независимо от того, на каком порте фактический сервер слушает?
Я не забочусь, является ли это haproxy, nginx, Пассажир или изменение направляющих. Я просто должен удостовериться большинство запросов, если не указано иначе, переданы обратно для портирования 80.
Спасибо!
Как указывал 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 используйте тот, который находится в контроллерах, поэтому значения по умолчанию применимы и к нему.
Перезапись перенаправления, вероятно, должна быть ответственностью веб-сервера, но вы можете взломать объект запроса, чтобы всегда возвращать порт 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
Если это ссылки, которые связаны с тем же сервером, что и сайт, на котором они находятся. Вы можете использовать относительные ссылки вместо абсолютных. Если вы используете вспомогательные методы для создания ссылок, вы можете использовать суффикс _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
Как видите, эти ссылки не зависят от порта или хоста, на котором вы работаете.
Я предлагаю исправить это в haproxy, добавив этот код в конфигурацию.
rsprep (.*):9000(.*) \1\2