使用 WebSockets 的后端服务器的 Apache 重定向规则

标签 apache mod-rewrite redirect websocket cherrypy

我试图弄清楚如何为实现 websocket 的后端 CherryPy 服务器正确设置 apache 重定向规则(通过 ws4py 模块完成)。问题是,如果您使用重写引擎或 proxypass,它会删除重定向请求中的 Upgrade header ,因此 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 header Upgrade:websocket的请求,apache引擎(重写模块)会将其剥离,这会导致WebSocket握手失败。

是否有任何方法可以修复重写规则以允许存在 Upgrade header ?

最佳答案

不幸的是,Apache 尚不具备反向代理 WebSocket 连接的能力(它绝对应该如此!)。但有一个解决方案允许使用 Apache 处理 Web 请求,并允许由其他东西处理 WebSocket 连接。该解决方案涉及使用 HAProxy 作为 apache 和 WebSocket 服务器的前端。

以下是一些可帮助您入门的相关链接:

关于使用 WebSockets 的后端服务器的 Apache 重定向规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12064882/

相关文章:

apache - 在 RedHat 的反向代理后面设置 Sonarqube

apache - 将所有http请求(包括子域)重定向到https

.htaccess - IIS 上的 rewritebase 的替代方案是什么?

wordpress - 在 WP 4.4.1 之后防止 WordPress 主页重定向

jsf - 如何使用导航规则进行重定向

.htaccess - 通过 htaccess 访问特定域时强制用户访问单个站点

php - Forbidden 您无权访问/在此服务器上。服务器无法读取 htaccess 文件,为了安全拒绝访问

apache - 使用docker bridge网络IP访问apache容器中的vhost

python - Apache 与 Django/Matplotlib 应用程序一起挂起

php - apache mod_rewrite url 问题