14

目前我能够从请求中获取主机,其中包括域和可选端口。不幸的是,它不包含协议(http 与 https),因此我无法为站点本身创建绝对 url。

object Application extends Controller {
  def index = Action { request =>
    Ok(request.host + "/some/path") // Returns "localhost:9000/some/path"
  }
}

有没有办法从请求对象中获取协议?

4

5 回答 5

11

实际上,有一种简单的方法可以使用反向路由器用来实现类似事情的 Call 类。鉴于您在隐式请求的范围内,您可以执行以下操作:

new Call(request.method, input.request).absoluteURL()

它将为您提供完整的 url(协议、主机、路由和参数)。

于 2014-08-21T17:56:26.647 回答
7

在 Play 2.3 及更高版本中,您可以使用Request的属性。secure

于 2014-09-07T10:32:52.540 回答
4

我不认为有。

一种解决方法是使用协议相对 url,使用//domain.com/path.

但是,这对电子邮件中的链接没有帮助。在这种情况下,您可以将协议放在application.conf. 在大多数情况下,差异是因为生产支持 https 而开发不支持。

我还没有找到上述解决方法不起作用的情况。

于 2013-02-13T23:10:48.237 回答
1

实际上,如果它是 http 或 https,您的端口号会给您。

使用 https 支持启动您的 Play 服务器JAVA_OPTS=-Dhttps.port=9001 play start

这是一个代码片段(您可以使用正则表达式使验证更加稳定,从属性中获取 https 端口号......)

def path = Action { request =>
    val path = 
      if(request.host.contains(":9000"))
        "http://" + request.host + "/some/path"
      else
        "https://" + request.host + "/some/path"
    Ok(path)
  }

代码将返回

http://ServerIp:9000/some/path if it's thru http
https://ServerIp:9001/some/path if it's thru https
于 2013-02-14T13:03:50.273 回答
0

我的解决方案是将 url 的开头作为 javascript 的附加参数传递。application.conf 解决方案对我不起作用,因为可以通过 http 和 https 访问相同的应用程序,但可以从不同的子网和域访问。

于 2014-03-14T11:13:16.527 回答