【问题标题】:How to get the subdomain value from a url?如何从 url 获取子域值?
【发布时间】:2010-11-30 04:31:12
【问题描述】:

如何在 rails 中获取子域值,有内置方法吗?

例如

test123.example.com

我想要 url 的 test123 部分。

【问题讨论】:

  • 你介意使用正则表达式吗?
  • 我认为通过提供一种解决方案来查找字符串的子域以及当前 url 会更好地回答这个问题。考虑到这是 google 上搜索“rails get the subdomain of a url”的排名第一的结果

标签: ruby-on-rails


【解决方案1】:

Rails 3.0 内置了这个能力,你可以从request.subdomain 访问子域。

也可以基于子域进行路由:

class SupportSubdomain
  def self.matches?(request)
    request.subdomain == "support"
  end
end

Basecamp::Application.routes do
  constraints(SupportSubdomain) do
    match "/foo/bar", :to => "foo#bar"
  end
end

如果您使用的是 2.3,则需要使用 subdomain-fu 等插件。

【讨论】:

  • 在使用机架中间件时有没有办法做到这一点? request.subdomain 不是只有 request.host 可用
  • @ cman77你可以尝试像thisrack-subdomain用于更复杂的情况。 SPAN>
  • @ CyleHunter肯定的是,如果你使用像pow做开发名称解析。 SPAN>
【解决方案2】:

带有子域的当前域:

"#{request.subdomain}.#{request.domain}"
# or
"#{request.subdomains.join(".")}.#{request.domain}"

【讨论】:

  • 意识到如果没有子域,这将在前面加上.;更强大的方法(如果子域可能为空白)类似于 current_domain = (request.subdomains + [request.domain]).join('.')
【解决方案3】:

如果您正在使用一个字符串,并假设它可以是一个真正的 URI,您可以这样做来提取子域。

require 'uri'

uri = URI.parse('http://test123.example.com')
uri.host.split('.').first
=> "test123"

https://stackoverflow.com/a/13243810/3407381

【讨论】:

  • 给 -1 因为 Rails 已经有一个内置函数可以做到这一点,所以这将重新发明轮子并且可能更容易出错。
  • +1 因为我实际上需要解析一个字符串。我试图解析request.referrer。不要听@corvuszero。问题并不具体。谢谢!
  • 我给了+1,因为你并不总是有合作的要求
  • 这对于包含句点的 TLD 将失败,例如 mysite.co.uk
【解决方案4】:

在控制器中使用以下方法

request.subdomains

这会返回一个子域数组

【讨论】:

  • request.subdomain 不返回数组。 request.subdomains 确实如此。注意 subdomain 的复数形式。
【解决方案5】:

account_location 也是一个不错的插件。使用后可以根据不同的子域找到账号。你可以通过编写从 url 中找到子域

request.subdomains(0).first
在您的代码中。

【讨论】:

    【解决方案6】:

    对于希望使用 WEBrick 在 localhost 上获取子域的任何人:

    config.action_dispatch.tld_length = 0 放入config/environments/development.rb,一切都会正常。

    链接到这里的帖子: Can I make Rails / WEBrick recognize entries in /etc/hosts as subdomains (instead of domains)?

    Github 帖子链接: https://github.com/rails/rails/issues/12438

    【讨论】:

    • 这确实是一个不错的小问题!很高兴你提到了这个
    【解决方案7】:

    在您的控制器中简单地执行以下操作

    unless request.subdomains.any?
       #No domains available redirect
       redirect_to subdomain: 'www'
    end
    

    【讨论】:

      【解决方案8】:

      您可以使用SubdomainFu plugin。该插件为您提供了一个方法 current_subdomain,它返回您应用的 current_subdomain。

      你也可以看看this Railscast

      更新

      您也可以使用request.subdomains,这将为您提供一个子域数组。

      【讨论】:

        【解决方案9】:

        聚会有点晚了,但这是我在旧版本的 rails 中使用的。

        subdomain = request.subdomains.join('.')

        它应该在较新的版本中向后兼容

        【讨论】:

          猜你喜欢
          • 2010-09-22
          • 2011-03-13
          • 1970-01-01
          • 2011-10-19
          • 2018-11-22
          • 1970-01-01
          • 2019-09-10
          • 2010-10-08
          相关资源
          最近更新 更多