1

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

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

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

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

编辑:更改StatusCodes.SeeOtherStatusCodes.MovedPermanently

4

1 回答 1

0

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

下面的版本通过了我的一组测试(见下文):

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
      }

    }
  }
}
于 2016-08-04T13:05:20.100 回答