PHP Fat-Free-Framework 加上 Node.js 和 Secure Websockets
PHP Fat-Free-Framework plus Node.js and Secure Websockets
我的任务是测试使用 F3 和 Node.js 以及 Socket.IO 用于我们即将推出的网络应用程序的可行性。该应用程序将专门使用 https。老板喜欢 F3 的模板,所以我们没有只在服务器端使用 Node。
F3 将用于提供静态内容。我想使用 WSS 为页面提供实时数据,并让客户端发出与该实时数据相关的请求。
我已经编写了一个测试应用程序,并且所有活动部件都可以正常工作,但我遇到了障碍。当我的客户端 WSS websocket 尝试连接到侦听 9220 的 Node 应用程序时,浏览器抱怨 CORS。我通过为 192.168.10.1:9220 设置例外来解决这个问题,但我怀疑这种方法是否适用于生产。
完成后,我们的网络应用程序将由我们自己的硬件提供服务,该硬件将成为客户现有网络的一部分。我使用的是通用名称为 192.168.10.1 的自签名证书。我目前正在做一个 'redirect permanent' 强制所有内容从 *:80 到 https。
我的问题是:有没有一种方法可以让 F3 抓取对“/blah_blah”的所有页面请求,并且可能有多个 Node 应用程序(我们肯定会有一个应用程序)监听它们各自的用于客户端连接的端口,并让这些客户端连接到节点端口而无需执行任何特殊例外?这一切都是通过 https 实现的吗?
我不知道是否需要调查使用更多虚拟主机或代理或什么。我想我想要的是一个前进的方向,即接下来要调查的内容,以便让所有部分都能在 https 上正常运行,而无需设置任何浏览器例外。
一个典型的页面将包含通过 F3 提供的文本和图形以及动态图形(通常作为 HTML5 Canvas 对象),仅当源数据更改时通过 WSS 更新.
更新:
事实证明,只需解决 CORS 问题(正如@ikkez 所建议的那样)就可以让我所有的移动部件正常工作。这些是我为了让它工作必须做的关键点:
创建了证书颁发机构并将其添加到浏览器
使用该 CA 为我们的服务器所在的 IP 签署证书。我的意思是 CommonName 就是 IP。
我在 *:443
上使用虚拟主机,服务器名称等于服务器所在的 IP。我还启用了重写以使用 F3。
<Directory /var/www/html/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* index.php [L,QSA]
</Directory>
我的节点应用程序的关键调用是:
var 选项 = {
键:fs.readFileSync('path-to-ssl/192.168.10.178.key'),
证书:fs.readFileSync('path-to-ssl/192.168.10.178.cer')
};
var app = https.createServer(options, function(req, res) {});
var io = require('socket.io').listen(app);
io.set('origins', '192.168.10.178*:*');
好吧,实际上您的问题是如何在 node.js 上启用 CORS 支持?!简短的 google search 为您提供了在 express.js 中执行此操作所需的全部资源。一旦您在您的节点应用程序中发送了正确的 CORS headers,您的浏览器就不会再大喊异常了。
不过,如果您只需要 websocket 来实时更新您网站上的内容,您也可以尝试使用 ajax 长轮询和新 $f3->until() methed, to load new data on demand. A little sample usage can be found here 的另一种方法。也许这已经可以解决问题了
我的任务是测试使用 F3 和 Node.js 以及 Socket.IO 用于我们即将推出的网络应用程序的可行性。该应用程序将专门使用 https。老板喜欢 F3 的模板,所以我们没有只在服务器端使用 Node。
F3 将用于提供静态内容。我想使用 WSS 为页面提供实时数据,并让客户端发出与该实时数据相关的请求。
我已经编写了一个测试应用程序,并且所有活动部件都可以正常工作,但我遇到了障碍。当我的客户端 WSS websocket 尝试连接到侦听 9220 的 Node 应用程序时,浏览器抱怨 CORS。我通过为 192.168.10.1:9220 设置例外来解决这个问题,但我怀疑这种方法是否适用于生产。
完成后,我们的网络应用程序将由我们自己的硬件提供服务,该硬件将成为客户现有网络的一部分。我使用的是通用名称为 192.168.10.1 的自签名证书。我目前正在做一个 'redirect permanent' 强制所有内容从 *:80 到 https。
我的问题是:有没有一种方法可以让 F3 抓取对“/blah_blah”的所有页面请求,并且可能有多个 Node 应用程序(我们肯定会有一个应用程序)监听它们各自的用于客户端连接的端口,并让这些客户端连接到节点端口而无需执行任何特殊例外?这一切都是通过 https 实现的吗?
我不知道是否需要调查使用更多虚拟主机或代理或什么。我想我想要的是一个前进的方向,即接下来要调查的内容,以便让所有部分都能在 https 上正常运行,而无需设置任何浏览器例外。
一个典型的页面将包含通过 F3 提供的文本和图形以及动态图形(通常作为 HTML5 Canvas 对象),仅当源数据更改时通过 WSS 更新.
更新:
事实证明,只需解决 CORS 问题(正如@ikkez 所建议的那样)就可以让我所有的移动部件正常工作。这些是我为了让它工作必须做的关键点:
创建了证书颁发机构并将其添加到浏览器
使用该 CA 为我们的服务器所在的 IP 签署证书。我的意思是 CommonName 就是 IP。
我在
*:443
上使用虚拟主机,服务器名称等于服务器所在的 IP。我还启用了重写以使用 F3。
<Directory /var/www/html/> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteRule .* index.php [L,QSA] </Directory>
我的节点应用程序的关键调用是:
var 选项 = {
键:fs.readFileSync('path-to-ssl/192.168.10.178.key'),
证书:fs.readFileSync('path-to-ssl/192.168.10.178.cer')
};var app = https.createServer(options, function(req, res) {});
var io = require('socket.io').listen(app);
io.set('origins', '192.168.10.178*:*');
好吧,实际上您的问题是如何在 node.js 上启用 CORS 支持?!简短的 google search 为您提供了在 express.js 中执行此操作所需的全部资源。一旦您在您的节点应用程序中发送了正确的 CORS headers,您的浏览器就不会再大喊异常了。
不过,如果您只需要 websocket 来实时更新您网站上的内容,您也可以尝试使用 ajax 长轮询和新 $f3->until() methed, to load new data on demand. A little sample usage can be found here 的另一种方法。也许这已经可以解决问题了