Scala 将http重定向到其他子域

Scala 将http重定向到其他子域,scala,spray,http-redirect,akka-http,spray-routing,Scala,Spray,Http Redirect,Akka Http,Spray Routing,我需要将没有子域的所有流量重定向到www子域(例如,foo.com->www.foo.com) 下面的代码正在工作,但我知道重定向代码可能很脆弱,可能会带来安全缺陷 这是实现上述目标的正确方法,还是我应该使用另一套指令 host(“^(?!www)。+”.r){h=> 不匹配路径{p=> schemeName{s=> 重定向(s“$s://www.h$p”,StatusCodes.MovedPermanently) } } } 编辑:更改了StatusCodes。请参见其他至StatusCod

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

下面的代码正在工作,但我知道重定向代码可能很脆弱,可能会带来安全缺陷

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

host(“^(?!www)。+”.r){h=>
不匹配路径{p=>
schemeName{s=>
重定向(s“$s://www.h$p”,StatusCodes.MovedPermanently)
}
}
}

编辑:更改了
StatusCodes。请参见其他
StatusCodes。永久移动
我的第一个错误是使用了错误的状态代码(
StatusCodes。请参见其他
而不是
StatusCodes。永久移动
),第二个错误只是使用了url的路径部分

以下版本通过了我的测试集(请参阅下文):

host(“^(?!www)。+”.r){h=>
不匹配路径{p=>
请求URI{s=>
val r=s.withHost(s“www.$h”)
重定向(r,状态代码。永久移动)
}
}
}
这通过了下面的测试

中的“正确重定向”{
“请求”|“重定向”|
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)=>{
获取(a.toString)~>整个路线~>检查{
状态===永久移动
标题(“位置”).get.value==b.toString
}
}
}
}

我的第一个错误是使用了错误的状态代码(
StatusCodes.see other
而不是
StatusCodes.MovedPermanently
),第二个错误只是使用了url的路径部分

以下版本通过了我的测试集(请参阅下文):

host(“^(?!www)。+”.r){h=>
不匹配路径{p=>
请求URI{s=>
val r=s.withHost(s“www.$h”)
重定向(r,状态代码。永久移动)
}
}
}
这通过了下面的测试

中的“正确重定向”{
“请求”|“重定向”|
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)=>{
获取(a.toString)~>整个路线~>检查{
状态===永久移动
标题(“位置”).get.value==b.toString
}
}
}
}