Rails:从_url helper中删除端口

时间:2010-10-29 11:47:24

标签: ruby-on-rails ruby-on-rails-3 omniauth thin

在rails中调用_url helper时,它将返回host + port + path,例如

photo_url

将返回

http://localhost:3000/photo

在我的生产环境中,我在给定端口上为rails应用程序提供瘦服务,在另一个端口上提供静态内容的apache。当网站没有任何端口时,每个服务器都知道要处理的部分,一切都很好。但是,如果给出了特定端口,则只有请求的服务器发送响应(这是预期的)。

我现在遇到了麻烦,因为当我通过oauth2(facebook,twitter)或openid验证用户时,我需要发送一个回调网址。我使用的gem(OmniAuth)使用_url助手(据我所知)(callback_url)来计算回调网址。由于附加的端口号,这导致仅对其他请求进行精简响应。

有没有办法告诉rails,它没有在任何特定端口上运行?或者它不使用_url助手中的portnumber?

2 个答案:

答案 0 :(得分:1)

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包括端口号

请注意,如有必要,您可以将full_host设置为OmniAuth.config.full_hostString,以便返回您要使用的值,从而将OmniAuth配置为使用固定的Proc

答案 1 :(得分:0)

您可以使用photo_path吗?