在PlayFramework中使用webSocketURL()和反向代理

在PlayFramework中使用webSocketURL()和反向代理,playframework,websocket,playframework-2.2,Playframework,Websocket,Playframework 2.2,我正在使用nginx背后的Play框架 nginx配置文件基本上与, 但为了启用websocket,编辑了如下位置指令 location / { proxy_buffering off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; pro

我正在使用nginx背后的Play框架

nginx配置文件基本上与, 但为了启用websocket,编辑了如下位置指令

location / {
  proxy_buffering off;
  proxy_set_header   X-Real-IP $remote_addr;
  proxy_set_header   X-Scheme $scheme;
  proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header   Host $http_host;

  proxy_http_version 1.1;
  proxy_pass  http://playframework;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "Upgrade";

}
在下面的JavaScirpt代码中

var ws = new WebSocket(jsRoutes.controllers.MyController().MyMethod().webSocketURL())
webSocketURL()返回以“ws://”开头的URL。 由于nginx以静默方式将HTTP转换为HTTPS,因此无法建立websocket连接

它在没有反向代理的本地环境中工作

解决这个问题的最佳方法是什么?
我当前的解决方法是禁用访问http的SSL。

好的,我发现
webSocketURL()
可以接受一个参数

var isSerure = location.protocol === "https:";
var wsUrl = jsRoutes.controllers.MyController.myMethod().webSocketURL(isSecure);

这解决了我的问题。我不知道它是在哪里记录的,但它起了作用。

您的网页最初是通过HTTPS页面提供的吗?如果是,则websocket将尝试通过
wss://
安全协议进行连接。您将需要实现安全的WebSocket,我在这里概述了这一点:我还要补充一点,最新的NGINX支持SSL TCP开箱即用。另外,出于安全原因,最好使用
wss://