重写非www到www除了子域rails 3和机架

时间:2012-09-08 01:21:08

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

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

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

我处于rails 3中,似乎应该使用Rack Middleware来实现,但是这是一个多租户应用程序,因此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

任何指针都会受到赞赏....

1 个答案:

答案 0 :(得分: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