使用https播放2个javascript路由

时间:2014-06-26 21:32:04

标签: nginx https playframework-2.0 cors

我正在使用play的javascript路由(http://www.playframework.com/documentation/2.2.x/ScalaJavascriptRouting)。我有一个nginx前端服务器,我配置为强制https。 当我尝试进行ajax调用时,我收到错误,因为javascript路由会生成http网址,而我的浏览器会因为跨域访问而阻止它们。

如何配置javascript路由以提供https网址?

3 个答案:

答案 0 :(得分:1)

你是怎么打电话的? Play JavaScript路由器返回具有两个属性的对象,一个是method属性,其中包含方法,例如POSTGET等。另一个是url属性,其中包含相对URL。

返回的对象上还有两个方法,一个名为absoluteURL,另一个名为webSocketURL。这些将根据当前页面的主机名返回绝对URL,根据当前页面是否安全,它们将是http或https(或ws或wss)。

因此,如果使用jQuery,你应该能够:

$.ajax(jsRoutes.controllers.MyController.myAction("foo")).then(...)

它将使用相对URL,或者您也可以:

var route = jsRoutes.controllers.MyController.myAction("foo")
$.ajax({
  method: route.method,
  url: route.url,
  ...
}).then(...)

答案 1 :(得分:0)

如果您尝试使用绝对网址发出请求,则主机名,协议和端口应该匹配,因为同源策略。您至少有两个选择:

  1. href="/your/page"
  2. 等ajax请求中使用相对网址
  3. 使用协议相对网址。示例:href="//your.domain.com/your/page
  4. 以下是Paul Irish关于协议相对网址的详细文章:

    http://www.paulirish.com/2010/the-protocol-relative-url/

答案 2 :(得分:0)

您必须将其作为参数传递给absoluteURL / websocketURL

Frome Chrome开发工具:

> jsRoutes.controllers.CalendarController.getEvents().absoluteURL
  function (s){return _s('http',s)+'localhost:9000'+r.url}

> jsRoutes.controllers.CalendarController.getEvents().absoluteURL()
  "http://localhost:9000/events"

> jsRoutes.controllers.CalendarController.getEvents().absoluteURL(true)
  "https://localhost:9000/events"

> jsRoutes.controllers.CalendarController.getEvents().webSocketURL
  function (s){return _s('ws',s)+'localhost:9000'+r.url}

> jsRoutes.controllers.CalendarController.getEvents().webSocketURL()
  "ws://localhost:9000/events"

> jsRoutes.controllers.CalendarController.getEvents().webSocketURL(true)
  "wss://localhost:9000/events"

_shttps://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/play/api/routing/JavascriptReverseRouter.scala#L54定义为

function(p,s){return p+((s===true||(s&&s.secure))?'s':'')+'://'}