spray-http重定向到其他子域

时间:2016-08-04 08:13:17

标签: scala spray http-redirect akka-http spray-routing

我需要将没有子域的所有流量重定向到www子域(例如foo.com - > www.foo.com)。

下面的代码正在运行,但我知道重定向代码可能很脆弱,可能会带来安全漏洞。

这是实现上述目标的正确方法,还是我应该使用另一套指令?

host("^(?!www).+".r) { h =>
  unmatchedPath { p =>
    schemeName { s =>
      redirect(s"$s://www.$h$p", StatusCodes.MovedPermanently)
    }
  }
}

修改:将StatusCodes.SeeOther更改为StatusCodes.MovedPermanently

1 个答案:

答案 0 :(得分:0)

我的第一个错误是使用了错误的状态代码(StatusCodes.SeeOther而非StatusCodes.MovedPermanently),第二个错误仅使用了网址的路径部分

以下版本通过我的测试集(见下文):

host("^(?!www).+".r) { h =>
  unmatchedPath { p =>
    requestUri { s =>
      val r = s.withHost(s"www.$h")
      redirect(r, StatusCodes.MovedPermanently)
    }
  }
}

这通过了下面的测试

"Redirect correctly" in {
    "request"                       | "redirect"                          |
    u("http://acme.com")            ! u("http://www.acme.com")            |
    u("http://foo.com")             ! u("http://www.foo.com")             |
    u("http://acme.com/search?a=1") ! u("http://www.acme.com/search?a=1") |
    u("http://acme.com/search#abc") ! u("http://www.acme.com/search#abc") |
    u("http://acme.com/service/")   ! u("http://www.acme.com/service/")   |
    u("https://acme.com")           ! u("https://www.acme.com")           |> { (a :java.net.URI, b :java.net.URI) => {
      Get(a.toString) ~> wholeRoute ~> check {
        status === MovedPermanently
        header("Location").get.value == b.toString
      }

    }
  }
}