我需要将没有子域的所有流量重定向到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
答案 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
}
}
}
}