我试图弄清楚如何为实现 websocket 的后端 CherryPy 服务器正确设置 apache 重定向规则(通过 ws4py 模块完成)。问题是,如果您使用重写引擎或 proxypass,它会在重定向请求中剥离Upgrade标头,因此 CherryPy 服务器会抱怨它并在握手步骤失败。
我的情况如下。我有带有 ws4py 模块的 CherryPy 服务器,它设置了 WebSockets。它在 localhost:9000 上运行。我想要一个 apache 前端,它只是将传入的请求重定向到后端服务器(它做的不止这些,但为简单起见,它应该这样做)。
我的 apache 规则很简单
RewriteRule ^(/websocket(/.*)?)$ http://some_host:9000$1 [P,L]
所以对于所有以 /websocket 开头的请求,它会将它们重定向到在端口 9000 上运行的后端服务器。P 标志代表代理,L 停止重写过程(参见http://borkweb.com/story/apache-rewrite-cheatsheet )
如果客户端发送带有 HTTP 标头Upgrade:websocket的请求,Apache 引擎(重写模块)会将其剥离,这会导致 WebSocket 握手失败。
有没有办法修复重写规则以允许升级标头的存在?