【问题标题】:rewrite non www to www except subdomain rails 3 and rack将非 www 重写为 www,除了子域 rails 3 和 rack
【发布时间】:2012-09-08 01:21:07
【问题描述】:

我需要能够将非 www 重写为 www,但在存在(非 www)子域的情况下则不需要。

so example.com to-> www.example.com 但 sub.example.com 仍然是 sub.example.com

我在 rails 3 中,这似乎应该使用机架中间件来完成,但问题是这是一个多租户应用程序,因此 TLD 可能是任何域。

这是我目前的位置:

  Class Www

  def initialize(app)
    @app = app
  end

  def call(env)

    request = Rack::Request.new(env)

    if !request.host.starts_with?("www.")
      [301, {"Location" => request.url.sub("//","//www.")}, self]
    else
      @app.call(env)
    end

  end

  def each(&block)
  end

end

任何指针将不胜感激......

【问题讨论】:

  • 你能在网络服务器中处理它而不是通过导轨或机架吗? Apache 或 Nginx 等有能力做到这一点。
  • 我在 Heroku,所以无法访问。
  • 我不会在 heroku 上拥有您的网站。 Heroku 将有停机时间(即使很小),当您的应用程序停机时,客户将前往您的网站寻求支持。如果两个都下线那就不好了。此外,您不希望扰乱您的应用程序的用户来更新您的网站。我会将您的网站放在其他服务上(即 Linode),并将根域和 www 指向该服务,然后将所有其他 *.subdomain.com 请求发送到 heroku。您可以在您的 dns 中执行此操作。然后在您的网站服务器上使用 nginx 或其他任何东西进行重定向。
  • 这还可以让您将您的网站和应用程序的代码分开,以防您想让某人在您的网站上工作而不获取您的应用程序的代码。我也不知道为什么我的答案被转换为评论......这是解决 OPs 问题的答案,即使没有直接回答所述问题。

标签: ruby-on-rails rack rack-middleware


【解决方案1】:

你现在的代码将重写“sub.example.com”,你的call函数可以这样重写:

def call(env)
  request = Rack::Request.new(env)

  # Redirect only if the host is a naked TLD
  if request.host =~ /^[^.]+\.[^.]+$/
    [301, {"Location" => request.url.sub("//","//www.")}, self]
  else
    @app.call(env)
  end
end

【讨论】:

  • 谢谢 - 这正好回答了这个问题。我想出了另一种不如正则表达式干净的解决方案:
    def needs_www?(request) url_array = request.host.split(".") %w{dev com net co}.any? {|tld| tld==url_array[1]} end
  • 呃 - 很抱歉在这个令人愤怒的评论标记中挣扎......无论如何 - 我基本上分裂了“。”并检查了它在随后的数组中的位置——它有效——但不如正则表达式那么优雅——所以谢谢!
  • @cman77 我应该提一下,我的解决方案将与组合 TLD(例如 .co.uk)中断。如果您需要处理这些情况,使用public suffix library 之类的东西应该是最简单的方法。
猜你喜欢
  • 2014-03-04
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2017-12-04
  • 2013-10-08
  • 2012-10-17
相关资源
最近更新 更多