我正在使用play的javascript路由(http://www.playframework.com/documentation/2.2.x/ScalaJavascriptRouting)。我有一个nginx前端服务器,我配置为强制https。 当我尝试进行ajax调用时,我收到错误,因为javascript路由会生成http网址,而我的浏览器会因为跨域访问而阻止它们。
如何配置javascript路由以提供https网址?
答案 0 :(得分:1)
你是怎么打电话的? Play JavaScript路由器返回具有两个属性的对象,一个是method
属性,其中包含方法,例如POST
,GET
等。另一个是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)
如果您尝试使用绝对网址发出请求,则主机名,协议和端口应该匹配,因为同源策略。您至少有两个选择:
href="/your/page"
href="//your.domain.com/your/page
。以下是Paul Irish关于协议相对网址的详细文章:
答案 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"
function(p,s){return p+((s===true||(s&&s.secure))?'s':'')+'://'}