在PlayFramework中使用webSocketURL()和反向代理
我正在使用nginx背后的Play框架 nginx配置文件基本上与, 但为了启用websocket,编辑了如下位置指令在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
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://
)