目前我能够从请求中获取主机,其中包括域和可选端口。不幸的是,它不包含协议(http 与 https),因此我无法为站点本身创建绝对 url。
object Application extends Controller {
def index = Action { request =>
Ok(request.host + "/some/path") // Returns "localhost:9000/some/path"
}
}
有没有办法从请求对象中获取协议?
目前我能够从请求中获取主机,其中包括域和可选端口。不幸的是,它不包含协议(http 与 https),因此我无法为站点本身创建绝对 url。
object Application extends Controller {
def index = Action { request =>
Ok(request.host + "/some/path") // Returns "localhost:9000/some/path"
}
}
有没有办法从请求对象中获取协议?
实际上,有一种简单的方法可以使用反向路由器用来实现类似事情的 Call 类。鉴于您在隐式请求的范围内,您可以执行以下操作:
new Call(request.method, input.request).absoluteURL()
它将为您提供完整的 url(协议、主机、路由和参数)。
在 Play 2.3 及更高版本中,您可以使用Request类的属性。secure
我不认为有。
absoluteURL
Play Framework 2.0的类的方法的Call
实现不建议这样做。一种解决方法是使用协议相对 url,使用//domain.com/path
.
但是,这对电子邮件中的链接没有帮助。在这种情况下,您可以将协议放在application.conf
. 在大多数情况下,差异是因为生产支持 https 而开发不支持。
我还没有找到上述解决方法不起作用的情况。
实际上,如果它是 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
我的解决方案是将 url 的开头作为 javascript 的附加参数传递。application.conf 解决方案对我不起作用,因为可以通过 http 和 https 访问相同的应用程序,但可以从不同的子网和域访问。