Rails: удалить порт из помощника _url

При вызове помощника _url в rails он вернет host+port+path, например

photo_url

вернусь

http://localhost:3000/photo

В моей производственной среде у меня есть тонкий сервис, обслуживающий приложение rails на данном порту, и apache, обслуживающий статический контент на другом порту. Когда доступ к сайту осуществляется без какого-либо порта, каждый сервер знает, какую часть обрабатывать, и все в порядке. Однако, если указан конкретный порт, только запрошенный сервер отправляет ответ (что ожидается).

Теперь у меня проблемы, потому что, когда я аутентифицирую пользователя через oauth2 (facebook, twitter) или openid, мне нужно отправить URL-адрес обратного вызова. Gem, который я использую (OmniAuth), использует помощник _url (насколько я могу судить) (callback_url) для вычисления URL-адреса обратного вызова. Это приводит только к тонкому ответу на дальнейшие запросы из-за добавленного номера порта.

Есть ли способ сообщить рельсам, что они не работают на каком-либо конкретном порту? Или что он не использует номер порта в помощнике _url?


person Peter    schedule 29.10.2010    source источник


Ответы (2)


OmniAuth не использует вспомогательную функцию, а использует свой собственный метод, который анализирует request.url для вычисления полного пути, если вы не предоставили конфигурацию самостоятельно.

OmniAuth callback_url:

def callback_url
  full_host + callback_path
end

OmniAuth full_host:

def full_host
  case OmniAuth.config.full_host
    when String
      OmniAuth.config.full_host
    when Proc
      OmniAuth.config.full_host.call(env)
    else
      uri = URI.parse(request.url)
      uri.path = ''
      uri.query = nil
      uri.to_s
  end
end

Таким образом, если вы заходите на страницу http://localhost:3000/whatever, OmniAuth будет использовать http://localhost:3000 в качестве full_url. Если к странице обращаются http://mysite.com/whatever, full_url будет http://mysite.com. Таким образом, номер порта сервера thin, обслуживающего страницу, не должен добавляться к URL-адресу, если только URL-адрес, используемый для доступа к странице, которая перенаправляет пользователя на обратный вызов, не включает номер порта.

Обратите внимание, что при необходимости вы можете настроить OmniAuth для использования фиксированного full_host, задав для OmniAuth.config.full_host значение String или Proc, которое возвращает значение, которое вы хотите использовать.

person Michelle Tilley    schedule 26.02.2011
comment
Ссылки для callback_url и full_host возвращают ошибку 404. Не могли бы вы обновить их? - person Pratik Khadloya; 04.04.2012
comment
Я думаю, нам также нужно будет перезаписать царство. - person Pratik Khadloya; 04.04.2012
comment
Вы можете переопределить область следующим образом: in-ssl-mode/10187892#10187892" title="omniauth и open id с google не работает при работе за nginx в режиме ssl">stackoverflow.com/questions/10032249/ (все еще не работает для меня, но по крайней мере, я получаю совместимый callback и realm, так что провайдер не жалуется) - person chesterbr; 14.08.2012

Можете ли вы вместо этого использовать photo_path?

person jordinl    schedule 29.10.2010
comment
Мне нужно было бы изменить драгоценный камень для этого, что не было бы хорошим решением. (Поведение гема правильное, странная у меня установка) - person Peter; 29.10.2010