【问题标题】:Play Framework 2.1: Scala: how to get the whole base url (including protocol)?Play Framework 2.1:Scala:如何获取整个基本 url(包括协议)?
【发布时间】:2013-02-13 21:32:58
【问题描述】:

目前我能够从request 获取主机,其中包括域和可选端口。不幸的是,它不包括协议(http vs https),所以我无法创建网站本身的绝对网址。

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

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

【问题讨论】:

  • 为什么需要绝对链接? (你的用例是什么?)
  • 我需要绝对 url 的几个例子:1) 一个 json api,它返回站点上其他 url 的路径(从资产到其他 api 入口点等)。 2) 向用户发送电子邮件。 3) 在外部网站上分享网址(发布到 api 等)
  • 更多用例:生成sitemap.xmlrss.xml

标签: scala request playframework-2.1


【解决方案1】:

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

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

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

【讨论】:

  • 很有趣,但不太适合我;它返回 http 而不是 https;其余的都是正确的。
  • @AndrewSwan 请注意,absoluteURL 有一个可选的布尔参数来指定是否要保护 url。如果您编写new Call(request.method, input.request).absoluteURL(true),那行代码将在安全环境下为您工作。不幸的是,无法从请求中获取“协议”(因此知道是否安全),但这里解释了一些解决方法:github.com/playframework/playframework/issues/2427
【解决方案2】:

在 Play 2.3 及更高版本中,您可以使用 the secure property of the Request 类。

【讨论】:

    【解决方案3】:

    我认为没有。

    一种解决方法是使用protocol relative urls//domain.com/path

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

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

    【讨论】:

    • 然而 play 2.1 确实支持 https,即使它没有正确记录,推荐的方法是拥有一个前端 https 服务器。
    • 是的,添加一个配置参数是可行的,但是因为这在其他语言中很容易获得,所以我认为使用 Play 会很容易!
    【解决方案4】:

    其实你的端口号会告诉你是http还是https。

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

    这是一个代码 sn-p(您可以使用正则表达式使验证更加稳定,从属性中获取 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
    

    【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2017-09-10
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多